将子类转换为超类后调用方法的有趣行为

2024-01-18

class A { 
    int i = 1; 
    int f() { return i; } 
} 
class B extends A { 
    int i = 2;
    int @Override f() { return -i; }
} 
public class override_test { 
    public static void main(String args[]) { 
         B b = new B(); 
         A a = (A) b;               // Cast b to an instance of class A. 
         System.out.println(a.i);   // Now refers to A.i; prints 1; 
         System.out.println(a.f()); // Still refers to B.f(); prints -2; 
    } 
}

我想知道为什么 a.f() 仍然引用 B.f() 而 a.i 引用 A.i。

提前致谢!


In java 字段不是多态的这就是为什么a.i指的是A.i

While a.f()指的是B.f()因为b是一个对象obB,尽管您将其投射到A这意味着您将只能使用在中声明的那些方法A.

但该对象仍然是类型B.

因此,当您访问字段时,它基于引用类型,而当您访问方法时,它基于对象类型

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将子类转换为超类后调用方法的有趣行为 的相关文章

随机推荐