Java的多态
2020-04-26 本文已影响0人
大红豆小薏米
- 哪些函数能够调用,取决于reference的类型
- 对于被override 的函数,调用哪个版本,取决于object的类型
- 如果非要调用reference 没有的类型,可以强制类型转换成object的类型
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(B obj){
return "B and B";
}
public String show(A obj){
return "B and A";
}
// 继承的一个隐形的函数
//public String show(D obj){
// return "A and D";
//}
}
class C extends B{}
class D extends B{}
public class Test{
public static void main(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));
// "A and A", 因为reference A可以自动匹配b
System.out.println("2-"+a1.show(c));
// "A and A", 同理
System.out.println("3-"+a1.show(d));
// "A and D", 就近匹配
System.out.println("4-"+a2.show(b));
// "B and A", 因为reference是A,匹配的是public String show(A obj), 但是这个在B里被重写,所以是"B and A"
System.out.println("5-"+a2.show(c));
// "B and A", 同理
System.out.println("6-"+a2.show(d));
// "A and D"
System.out.println("7-"+b.show(b));
// "B and B"
System.out.println("8-"+b.show(c));
// "B and B"
System.out.println("9-"+b.show(d));
// "A and D", B里面有三个函数的
}
}