小编典典

Java中的动态方法调度

java

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()方法?


阅读 342

收藏
2020-11-26

共1个答案

小编典典

你有区分 静态类型aObj运行时类型aObj

代码如

A aObj = new B();

产生aObj具有静态类型A和运行时类型的变量B

在决定允许或不允许的内容时,编译器也只会考虑 静态类型

对您的问题:

1.为什么我无法通过aObj访问该变量,尽管它引用的是B类?

因为有(一般)没有办法让编译器 知道
aObj会是指一个B对象在运行时,只知道它会是指某种形式的A对象。由于.b并非在所有A对象上都可用,因此编译器会认为
“安全胜于遗憾” 并不允许这样做。

2.为什么我可以使用show()方法?

由于这种方法 在所有可用的A对象(如果它没有在子类中声明,它仍然继承自A)。

2020-11-26