package test1;
class A {
public String s = "123";
public void show(A obj){
System.out.println("A and A");
}
public void show(D obj){
System.out.println("A and D");
}
}
class B extends A{
public String s = "456";
public void show(B obj){
System.out.println("B and B");
}
public void show(A obj){
System.out.println("B and A");
}
public void show(E obj){
System.out.println("B and E");
}
}
class C extends B{
}
class D extends B{
}
class E{
}
public class F002 {
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();
E e = new E();
a1.show(b);
a1.show(c);
a1.show(d);
System.out.println(a1.s);
a2.show(b);
a2.show(c);
a2.show(d);
//a2.show(e);//这句编译不过
System.out.println(a2.s);
b.show(b);
b.show(c);
b.show(d);
b.show(e);
System.out.println(b.s);
}
}
输出有三段:
第一段涉及到向上转型,不太难
第二段涉及到的内容是:
将一个子类的对象赋值给父类的变量,执行程序时是按照父类的逻辑去寻找该执行哪个方法,等找到了那个方法之后,却是按照着子类的实现方式来执行
第三段涉及到的内容是:
动态绑定方面的知识,一个对象在调用一个方法时,jvm会依次在其父类、其父类的父类、一直到object类,一旦找到符合的方法,就去执行它。