多态的定义
:如果编译时和运行时类项不一样就会出现所谓的多态(polymorphism),多态可以向上转型。
- 编译时类项:声明该变量时使用的类型决定
- 运行时类项:实际赋给该变量的对象决定
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态存在的三个必要条件:
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
父类引用生成子类对象,那这个引用只能调用在父类中已经定义过的属性和方法,而对子类自己新定义的属性和方法则不能访问。
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(A obj){
return ("B and A");
}
public String show(B obj){
return ("B and B");
}
}
class C extends B
{
}
class D extends B
{
}
public class MultiTest{
public static void main(String[] args){
A ab = new B();
B b = new B();
C c = new C();
System.out.println(ab.show(b));
System.out.println(ab.show(c));
System.out.println(b.show(c));
//结果为:B A ,B A ,B B
}
}
A ab=new B();
:ab是一个父类引用,之后执行ab.show(b),这时ab先从父类中查找方法,与之匹配的只有show(A obj)方法,而且发现子类重写了该方法,这时动态链接到子类的show(A obj)方法。
b.show(c);
:这里,b中有show(A obj)方法和show(B obj)方法,继承层次为C->B->A,根据重载的最近匹配原则,会调用show(B obj)方法。