前言
多态是java的一大特征,继承是多态的基础,下面简单的展现了多态的特性。
我们首先需要了解的知识是:1.方法调用优先级:this.show(object) -> super.show(object) -> this.show(super(object)) -> super.show(super(object))
2.Parent p2 = new Child(); 创建父类Parent引用p2,指向子类Child对象。(向上转型,这样父类就能调用子类里重写父类的方法)
方法调用优先级解释:
对象调用方法时有时候会得出意向不到的结果,这是对java方法调用优先级不够了解,上面的顺序就是java方法调用优先级。
首先 找到本类参数列表为object对象的方法 -> 找到父类参数列表为object对象的方法 -> 找到本类参数列表为object的父类对象的方法 -> 找到父类参数列表为object的父类对象的方法 (->代表上个方式没找到用下个方式找,找到则停止)
public class Test{
public static void main(String[] args){
Parent p1 = new Parent();
Parent p2 = new Child();//向上转型
Child c = new Child();
System.out.println(p1.show(p1));
System.out.println(p2.show(c));
System.out.println(c.show(c));
}
}
class Parent{
public String show(Parent obj){
return ("This is Parent!!!");
}
}
class Child extends Parent{
public String show(Parent obj){
return ("This is Parent and Child!!!");
}
public String show(Child obj){
return ("This is Child!!!");
}
}
输出结果:This is Parent!!! 调用过程: p1.show(p1) 也就是 this.show(object)调用成功
This is Parent and Child!!! p2.show(c) 前面调用失败一直到 -> this.show(super(object)) 也就是p2.show(p1) (p1是参数类型为Parent的父类对象)
也就是找到了子类的show(Child obj)方法,但父类没有此方法 无法调用,跳到子类的show(Parent obj)方法
This is Child!!! c.show(c) 也就是 this.show(object)调用成功
注意事项
虽然整体方法调用比较简单,但需要特别注意像p2.show(c)虽然是调用参数类型为Child的子类方法找到了,但是由于父类没有参数类型为Child的方法是无法调用的(父类无法调用子类自己的方法,只能调用子类重写的方法)。