多态性
多态性是一种允许使用一个界面来访问一类动作的特性,特定的动作可以由不同的具体情况而定(传入 不同的参数)。多态性是发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用
public class Test1 {
public static void main(String[] args) {
Fa cc=new Fa();
//调用的是一个名称为pp的方法,但是参数不同执行的处理不同
cc.pp();//Fa...pp
cc.pp(12);//Fa.pp(int)
}
}
class Fa{
public void pp(){
System.out.println("Fa...pp");
}
public void pp(int k){
System.out.println("Fa.pp(int)");
}
}
多态性通过允许同一界面指定一类动作减少了程序的复杂度,编译器工作就是选择适用于各个情况的特 定动作,而程序员则无须手动进行选择,使用者仅仅是记得以及利用这个统一的界面
多态形成的三个必要条件:
有继承,父类定义方法,子类重写方法
父类的引用指向子类的对象
可以使用参数传递时多态,也可以直接创建对象时多态
多态可以用三个定义和两个方法来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。
多态分为两种:
编译时多态:方法的重载
运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行 时多态
对象的多态性
继承表示的是is a的语义
public class 汽车 extends 车库{} 错误的
public class 学生 extends 人{} 正确的,因为任何一个学生都是人
强调的一个点:编程是对现实世界的模拟体现
class 动物{}
class 猫 extends 动物{}
猫 x=new 猫();
动物 x=new 猫(); 正确的,因为所有的猫都是动物,因为定义class 猫 extends 动物{}
猫 x=new 动物(); 错误,不是所有的动物都是猫,因为动物是猫的父类
一个对象x有两种形态,猫这类事物即具有猫的形态,又具有着动物的形态,这就是对象的多态性。简单 说就是一个对象对应着不同类型
Object x=new Student();
Person x=new Student();
Student x=new Student();
多态在代码中的体现
父类或者接口的引用指向其子类的对象。例如:动物 x=new 猫()
public class Test1 {
public static void main(String[] args) {
动物 x1 = new 动物();
动物 x2 = new 猫();// 猫extends动物,表示猫具有动物的所有特性,同时猫具备一些自己
都有的特性
// x2.play();语法报错的原因是:编译器类型和运行时类型的问题
}
}
class 动物 {}
class 猫 extends 动物 {
public void play() {
System.out.println("使劲的抓老鼠....");
}
}
public class Test1 {
public static void main(String[] args) {
动物 x2 = new 猫();// 猫extends动物,表示猫具有动物的所有特性,同时猫具备一些自己
都有的特性
x2.play(); //使劲的抓老鼠...
//这里语法不报错的原因是动物类中定义了play方法,但是真正运行时系统则会发现实际上是
猫,所以需要调用的不是动物类中的方法,而是猫中定义方法
}
}
class 动物 {
public void play() {
System.out.println("使劲的睡觉....");
}
}
class 猫 extends 动物 {
public void play() {
System.out.println("使劲的抓老鼠...");
}
}
对象多态性可以使程序有良好的扩展,并可以对所有类的对象进行通用处理
public class Test1 {
public static void main(String[] args) {
需要使用动物的类 tt=new 需要使用动物的类();
tt.pp(new 动物());
tt.pp(new 猫());
}
}
class 需要使用动物的类 {
public void pp(动物 dongwu){ //假设定义方法时参数使用pp(猫 dongwu),当前程
序就和猫类耦合了,如果需要切换到狗则必须修改源代码。但是参数类型为动物,则不管是猫还是
狗都能接收
dongwu.play();
}
}
多态引用时,构造子类对象时的构造方法的调用顺序
先调用超类的构造方法,多重超类首先调用最远超类的方法
然后再执行当前子类的构造方法