多态
一、定义
某一个事物,在不同时刻表现出来的不同状态(同一个对/事物,在不同时刻体现出来的不同状态。)
动物 d= new 猫();从右往左念
eg:猫是猫,猫是动物。水(液体,固体,气态)。
二、多态的前提:
A:继承
B:方法重写。
C:要有父类引用指向子类对象。父 f = new 子();
三、用代码体现一下多态。
class Fu{
public int name;
public void eat(){
System.out.println("吃大蒜");
}
public static void show(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num2;
public void eat(){
System.out.println("吃西餐");
}
public static void show(){
System.out.println("zi");
}
public void method(){
System.out.println("zi de method");
}
}
class ZiDemo{
public static void main(String[] args){
Fu f = new Zi();
f.eat(); // 吃西餐
f.show(); //静态方法,结果是fu
f.method(); //程序报错
}
}
通过程序我们可以得出多态中的成员访问特点:
A:成员变量:编译看左边,运行看左边。
B:构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法:编译看左边,运行看右边。(因为存在方法的重写)
D:静态方法:编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)
四、多态的好处和弊端:
好处:
A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)
弊端:
A:不能使用子类特有功能
大是当想使用子类特有方法是有两种方式分别是:
-
创建子类对象,然后进行方法的调用(有不合理之处,原因之一太占内存)
- 把父类的引用强制转换为子类的引用(向下转型)
五、对象间的转型问题:
A:向上转型:
Fu f = new Zi();
B:向下转型:
Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
/*
public void show() {
show2();
}
*/
public void show2() {
System.out.println("爱");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
public class DuoTaiTest4 {
public static void main(String[] args) {
A a = new B();
a.show(); //爱
B b = new C();
b.show(); //你
}
}
看到程序的时候,我认为的输出及结果是我、我。但是通过测试发现输出结果是爱、你,是因为:
继承的时候:
子类中有和父类中一样的方法,叫重写。
子类中没有父亲中出现过的方法,方法就被继承过来了。