多态,前提,特点,好处,弊端

时间:2022-10-03 16:19:04
<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
必须加强制类型转换。
*/