<pre name="code" class="java">class Animal {
public void eat() {}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog eat");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat eat");
}
public void play() {
System.out.println("猫捉迷藏");
}
}
class DuoTaiDemo7 {
public static void main(String[] args) {
Animal a = new Dog(); //向上转型
a.eat();
a = new Cat(); //向上转型
a.eat();
//报错
//a.play();
//创建子类对象
//Cat c = new Cat();
//c.play();
Cat c = (Cat)a; //<span style="color:#ff0000;"><strong>向下转型---->为了调用子有父没有(cat有animal没有)的方法。此题为了c.play()</strong></span>
c.eat();
c.play();
//ClassCastException:类型不匹配
a = new Dog();
Dog d = (Dog)a;
a.eat();
}
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">多态:对象在不同时刻表现出来的多种状态。</span> 举例:
水(水蒸气,冰,水)
动物和狗。
动物是动物,
动物是狗。
狗是狗。
狗是动物。
Java代码的体现:
多态的前提:
多态的前提:
A:要有继承或者实现关系。
B:要有方法的重写。
没有方法重写,继承抽象类,或者实现接口,没有意义。
C:要有父类(父接口)引用指向子类对象。
/*
多态:
编译和运行的状态不一致。 ******* !!!!注意:这些自我总结是针对多态的,平时的简单继承,还是先找子类再找父类!!!!*****
Fu f = new Fu(); //
Zi z = new Zi(); __________________________________//_____________________________________________________________________
| |
多态的成员特点: | |
成员变量:--------------------|--------->只找父类;若是方法中的成员变量,先找此方法所在的(子//父)类中是否有, |
编译看左边,运行看左边。 | _ (有则用,无则看父有没有//有则用,无则报错,不能逆向去找子类了) |
成员方法(要求是重写): | | 先找子类,再找父类。(方法中嵌套方法,也是先找子类再找父类) |
编译看左边,运行看右边。--|----------| 既然成员方法重写了,肯定依照重写的来(重写肯定指的是子类的方法),所以看右边。 |
| |_ 不重写,就不符合多态了,依照原方法来,即在左边了。 |
静态成员方法: | |
编译看左边,运行看左边。--|--------->只找父类。。静态是与类相关,而不是对象。 |
| |
为什么呢? |_________________________________________________________________________________________________________|
因为方法有重写,而变量没有。
*/
/*
多态的好处:
A:维护性(是有继承保证)
B:扩展性(当你不知道将来使用哪个子类的时候,那么,就把这里传递父类的引用。这个时候,你将来不管传递哪个子类,我都可以接收)
弊端:
不能使用子类的特有功能。
多态的弊端:
不能使用子类的特有功能。
我就要使用,怎么办呢?
A:创建子类对象。可以解决,但是不合理。
B:多态中的转型问题
a:向上转型
从小到大。Dog,Cat - Animal
b:向下转型
从大到小。Animal -- Dog,Cat
必须加强制类型转换。
*/