public class Text3 {
public static void main(String[] args) {
AAA a1 = new AAA();
AAA a2 = new BBB();
BBB b = new BBB();
C c = new C();
D d = new D();
System.out.println(a2.show(b));//B and A
}
}
class AAA {
public String show(D obj){
return ("A and D");
}
public String show(AAA obj){
return ("A and A");
}
}
class BBB extends AAA{
public String show(BBB obj){
return ("B and B");
}
public String show(AAA obj){
return ("B and A");
}
public String show(D obj){
return ("D and A");
}
}
class C extends BBB{}
class D extends BBB{}
然后你就想用继承了父类AAA的子类去实现子类中已经覆写了父类的方法,却发现最后的输出依旧是父类的方法。
在父类的方法前加一个abstract关键字使父类的方法变成抽象方法,问题就解决了
如果把AAA类中的show(AAA obj)方法参数改为show(Object obj),输出结果竟然是A and A,更加奇怪了!!!
对象引用能用的方法看引用的类型
方法的执行看对象的类型
嗯,大概就这样
首先,删掉你用不到的变量,会分散你的注意力。
先说为什么不是B and B。
AAA a2 = new BBB();
System.out.println(a2.show(b));//B and A
这里面a2虽然指向一个BBB对象,但声明的是一个AAA,所以a2只能调用AAA中的两个方法:public String show(D obj)和public String show(AAA obj)。根本访问不到方法public String show(BBB obj)。
然后,a2确实指向一个BBB对象,因为BBB继承自AAA,show(AAA obj)被BBB中的show(AAA obj)覆盖,结果就是B and A。
最后,为什么参数b可以传入show(AAA obj)?
虽然传入的参数b是BBB类型,但AAA是BBB的父类,参数b可以被show(AAA obj)接受。