class A2 {
int numt=111;
void hello() {
System.out.println("Hello from A2");
}
}
class B2 extends A2 {
void hello() {
System.out.println("Hello from B2");
}
}
class C2 extends B2 {
int numt=666;
void hello() {
System.out.println("Hello from C2");
}
}
class MethodOverriding2 {
public static void main(String args[]) {
A2 obj = new C2();
obj.hello();
System.out.println("Num is : " + obj.numt);
}
}
所以基本上这里的输出是
Hello from C2
Num is : 111
为什么它从 C2 运行 hello() 而从 A2 运行 numt?
据我了解,我将 A2 继承到 B2,将 C2 继承到 B2。然后在我的主体中,我创建了一个引用 C2 的类 A2 的对象(它可以这样做,因为 A2 是 C2 的父类(super class))。 然后在编译时没有错误,因为代码是满足的。 在运行时,程序会在“obj”所指的位置而不是在其定义位置查找“hello()”。 但它对 'numt' 做相反的事情。为什么会这样?我的上述理解是否正确?如果不是,请更正。
非常感谢!我知道这是一个新手问题,我是 OOP 的新手。
最佳答案
当你调用方法时,将调用实例中的方法,而不是由于多态性而引用类型。这里你的对象是 C2,即使引用是 A2 类型,所以 C2 中的方法将被调用。
当您访问变量时,它是引用类型而不是对象类型,因为多态性不适用于字段。这就是为什么将您的变量设为私有(private)总是好的设计,这样其他类就无法直接访问这些变量。
关于java - 继承不同的变量和方法的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431729/