java - 将子类转换为父类(super class)后调用方法的有趣行为

标签 java casting

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。

提前致谢!

最佳答案

在 java 中字段不是多态的,这就是为什么 a.i 引用 A.i

虽然 a.f() 引用 B.f() 因为 b 是一个对象 ob B,但你将其强制转换为 A 意味着您将只能使用 A 中声明的那些方法。

但是该对象仍然是B类型。

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

关于java - 将子类转换为父类(super class)后调用方法的有趣行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912847/

相关文章:

java - 有什么方法可以根据某些条件递归调用 Rythm 模板吗?

java - 在MongoDB中: longer property names make bigger documents/use more memory?

c - 以下哪一种是设置无符号整数最大值的更便携的方法?

java - 为什么转换方向在原始类型中从大到小,在对象中从小到大?

c++ - if 语句中的函数名以一种奇怪的方式转换

java - 如何配置 Ehcache 进行点对点复制

java - 在 JAR 中使用 Tomcat 连接池(来自 Web 应用程序的共享配置,spring 配置)

java - B 样条基函数似乎产生不正确的值

c++ - 如何在基类指针 vector 的元素上应用重载的多态函数

python - 在 Python 中将大整数截断为 uint8 类型