public class ABCD{
public static void main(String[] args) {
// show(A) show(D)
A a1 = new A();
// show(B) 重写show(A) 继承show(D)
A a2 = new B(); // B extends A
B b = new B(); // 同上
// 继承B的 show(A) show(B) show(D)
C c = new C(); // C extends B
D d = new D(); // D extends B 同上
// a1本身就是A类,执行A类的方法:
// 执行A类的show(A),b被转换为其父类A
System.out.println(a1.show(b)); // A and A
// 执行A类的show(A),c被转换为其父类B的父类A
System.out.println(a1.show(c)); // A and A
// 执行A类的show(D),无转换优先
System.out.println(a1.show(d)); // A and D
// a2定义的是A类,执行A类的方法,被子类重写的才会运行子类的方法:
// 应该执行A类的show(A),不过方法被重写所以执行子类show(A)
System.out.println(a2.show(a1)); // B and A
// 应该执行A类的show(A),不过方法被重写所以执行子类show(A)
System.out.println(a2.show(b)); // B and A
// 应该执行A类的show(A),不过方法被重写所以执行子类show(A)
System.out.println(a2.show(c)); // B and A
// 执行A类的show(D)
System.out.println(a2.show(d)); // A and D
// b定义的是B类,执行B类的方法,继承的方法匹配时执行继承的方法:
// 执行B类的show(B),无转换优先
System.out.println(b.show(b)); // B and B
// 执行B类的show(B),c被转换为其父类B
System.out.println(b.show(c)); // B and B
// 执行继承自A类的show(D),无转换优先
System.out.println(b.show(d)); // A and D
}
}
class A {
//D是B的子类,最小,只有传入D才会运行
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");
}
// 这里没有重写的方法其实继承下来了
// public String show(D obj) {
// return ("A and D");
// }
}
class C extends B {
}
class D extends B {
}
继承与多态经典题目注释解析
最新推荐文章于 2022-10-23 09:22:46 发布