打印结果:Child show num 总结:多态成员方法 1、编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败(如果把 parent.show_1() 前面的注释打开,则编译失败)。 2、运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法(如果把子类重写的 show() 方法注释掉,那么打印的结果是 Parent show num)。 简而言之:编译看左边,运行看右边。
实例三 综合运用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
classA{
public String show(D obj){ //方法一
return ("A and D");
}
public String show(A obj){ //方法二
return ("A and A");
}
}
classBextendsA{
public String show(B obj){ //方法三
return ("B and B");
}
public String show(A obj){ //方法四
return ("B and A");
}
}
classCextendsB{
}
classDextendsB{
}
publicclassTest1{
publicstaticvoidmain(String[] args){
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
那我们开始分析输出 A a1 = new A(),这是普通的创建对象,故 a1 拥有调用方法一和方法二的能力。那么究竟调用哪个方法呢?这里面涉及方法的重载。其实,在编译的时候,编译器已经进行了前期绑定,也就是说,在编译时,系统就已经知道应该调用哪个方法,即使你有方法的重载。