java - 为什么 java ref vars 调用基于实际对象的方法,而变量基于 ref 变量类型?

标签 java inheritance

在父类(super class) A 和子类 B 中,我都有变量 abc 分别为 10 和 20,并且在子类中重写了一个方法 callme()。

如果我这样做

A a = new B(); 
B b = B(new A());

那么如果我写

a.callme() -> calls B's method
b.callme() -> calls A's method. 

这是因为方法是根据实际对象调用的。

如果我这样做

str = a.abc; // will print 10 , based upon ref var type A

str = b.abc; // will print 20 , based upon ref var type B

为什么会有这种差异?为什么不根据实际对象访问方法和变量?

谢谢

最佳答案

请记住,实例变量永远不会被覆盖,它们是隐藏的。引用的类型决定了将访问谁的实例变量。

在子类中,callme() 方法被覆盖。因此,根据动态方法调度机制,对象的类型决定了在运行时将调用哪个方法。这是因为,对象是在运行时创建的。

例如

class A {
       int abc = 10;

       public void callme() { 
           System.out.println("In class A");
        }
   }

class B extends A {   
       int abc = 20;  // hidden, not overidden

        public void callme() { 
           System.out.println("In class B");
        }

        public static void main(String [] args) {
        A a = new A();
        a.callme(); // calls A's callme() method. 

        B b = new B();
        b.callme(); // calls B's callme() method.
       }
 }

关于java - 为什么 java ref vars 调用基于实际对象的方法,而变量基于 ref 变量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6873446/

相关文章:

java - Miglayout + hidemode 3 = 显示控件时不需要的自动滚动

java - 如何在 SQLite 中以与插入相反的顺序选择表行?

java - 抽象类和公共(public)代码

java - 如何在具有一对一关系的 Hibernate 中进行继承映射?

c++ - 从基类方法使用派生类数据成员

c++ - 错误 : out-of-line definition of 'test' does not match any declaration in 'B<dim>'

c++ - Python 3 继承与 C++ 相同

java - 生成6位随机数

java - 关于 IF 语句

java - 读取返回 StreamingResponseBody 作为响应的 API