什么是多态
多态:多态是一种运行期的状态,表示同一操作(new 猫()
)作用于不同对象(猫 m
和动物 d
),可以有不同的解释(//猫是猫
和//猫是动物
),产生不同的执行结果
举例:
猫 m=new 猫()//猫是猫
动物 d=new 猫()//猫是动物
说明:
有些文档说运行时多态和编译时多态
-
编译时多态主要指方法重载
-
运行时多态指沉痼中定义的对象引用所指向的具体类型在运行期确定
这种说法是错误的,继承中根本不存在重载,重载的定义是在同一个类中
多态的必要条件
-
要有继承关系
-
要有方法重写(其实可以不写,但是不写无法体现多态,无意义)
-
要有父类引用指向子类对象
public class Parent{
public void call(){
sout("im Parent");
}
}
public class Son extends Parent{// 1.有类继承或者接口实现
@Override
public void call(){// 2.子类要重写父类的方法
sout("im Son");
}
}
public class Daughter extends Parent{// 1.有类继承或者接口实现
@Override
public void call(){// 2.子类要重写父类的方法
sout("im Daughter");
}
}
public class Test{
public static void main(String[] args){
Parent p = new Son(); //3.父类的引用指向子类的对象
Parent p1 = new Daughter(); //3.父类的引用指向子类的对象
}
}
多态中的成员访问特点
成员变量:编译父亲的(看父类是否有该调用方法,使用父类的,输出父类的)编译看左边,运行看左边
构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化,再对子类进行初始化
成员方法:编译父类的,使用子类的(因为子类重写了该方法):编译看左边,运行看右边
静态方法:编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问的还是左边的)
多态的优缺点
优点:
-
提高了代码的维护性(继承就可以保证)
-
提高了代码的扩展性
-
多态可以解决在某种条件下不知道具体事物的属性,只知道行为的情况
-
可以使用多态进行类扩展。
缺点:
-
不能使用子类的特有功能
解决方法:把父类的引用赋值给子类(向下转型)
Fu f=new Zi() Zi z=(Zi)f//必须加强制转换,否则就不兼容
-
对象间的转型问题:
向上转型:
Fu f=new Zi()
向下转型:
Zi z=(Zi)f;//必须满足f可以转换为Zi