Jee*_*evi 2 java inheritance casting
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
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,我尝试调用aObj.b时遇到错误.
1.为什么我不能通过aObj获取该变量,尽管它是指B类?
2.为什么我能够访问方法show()?
你有区分静态类型的aObj和运行时类型的aObj.
代码如
A aObj = new B();
Run Code Online (Sandbox Code Playgroud)
导致aObj具有静态类型A和运行时类型的变量B.
在决定允许和不允许的内容时,编译器只会考虑静态类型.
对你的问题:
1.为什么我不能通过aObj获取该变量,尽管它是指B类?
因为有(一般)没有办法让编译器知道那aObj会是指一个B对象在运行时,只知道它会是指某种形式的A对象.由于.b并非所有A对象都可用,因此编译器会认为"比对不起更安全"并且不允许它.
2.为什么我能够接受方法show()?
由于这种方法是在所有可用的A对象(如果它没有在子类中声明,它仍然继承自A).