class A{ int a=10; public void show(){ System.out.println("Show A: "+a); } } class B extends A{ public int b=20; public void show(){ System.out.println("Show B: "+b); } } public class DynamicMethodDispatch { public static void main(String[] args) { A aObj = new A(); aObj.show(); //output - 10 B bObj = new B(); bObj.show(); //output - 20 aObj = bObj; //assigning the B obj to A.. aObj.show(); //output - 20 aObj = new B(); aObj.show(); //output - 20 System.out.println(bObj.b); //output - 20 //System.out.println(aObj.b); //It is giving error } }
在上面的程序中,我尝试调用 aObj.b时 遇到错误。 1.为什么我无法通过aObj访问该变量,尽管它引用的是B类? 2.为什么我可以使用show()方法?
你有区分 静态类型 的aObj和 运行时类型 的aObj。
aObj
代码如
A aObj = new B();
产生aObj具有静态类型A和运行时类型的变量B。
A
B
在决定允许或不允许的内容时,编译器也只会考虑 静态类型 。
对您的问题:
1.为什么我无法通过aObj访问该变量,尽管它引用的是B类?
因为有(一般)没有办法让编译器 知道 那aObj会是指一个B对象在运行时,只知道它会是指某种形式的A对象。由于.b并非在所有A对象上都可用,因此编译器会认为 “安全胜于遗憾” 并不允许这样做。
.b
2.为什么我可以使用show()方法?
由于这种方法 是 在所有可用的A对象(如果它没有在子类中声明,它仍然继承自A)。