package com.scy;publicclassAnimal{publicint age =40;publicvoideat(){
System.out.println("吃东西");}}
package com.scy;publicclassCatextendsAnimal{publicint age =30;public String name ="猫";@Overridepublicvoideat(){
System.out.println("猫吃鱼");}publicvoidplayGame(){
System.out.println("玩游戏");}}
package com.scy; #多态可扩展性的体现;
publicclassAnimalOperate{// public void useAnimal(Cat c){ // Cat c = new Cat();// c.eat();// }// public void useAnimal(Dog d){ // Dog d = new Dog();// d.eat();// }publicvoiduseAnimal(Animal a ){//Animal a = new Cat();多态
a.eat();}}
package com.scy; # 测试类
publicclassMainApp{publicstaticvoidmain(String[] args){
AnimalOperate ao =newAnimalOperate();
Cat c =newCat();
ao.useAnimal(c);
Dog d =newDog();
ao.useAnimal(d);}}
多态中的转型问题:
向上转型:
从子到父
父类引用指向子类对象
向下转型:
从父到子
父类引用转为之类对象
publicclassMainApp{publicstaticvoidmain(String[] args){//多态
Animal a =newCat(); # 向上转型
# 父类引用指向子类对象
a.eat();
a.playGame();//无法访问子类特有方法// Cat c = new Cat();//这样虽然可以访问子类的特有方法,但是不合理,//内存中有两个猫对象;// 如何使用一个子类访问子类特有方法?// 就要使用多态中的转型了;
# 父类引用转为之类对象
Cat c =(Cat)a;
c.eat();
c.playGame()}
多态转型内存图解:
(ClassCastException)类型转换异常
多态的练习:
package com.scy;publicclassMainApp{publicstaticvoidmain(String[] args){
Animal a =newCat();//向上转型
a.eat();
Cat c =(Cat) a;//向下转型
c.eat();
c.play();
a =newDog();//向上转型
a.eat();
Dog d =(Dog) a;//向下转型
d.eat();
d.lookDoor();}}