java - 继承不同的变量和方法的行为

标签 java inheritance

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/

相关文章:

java - Liferay 的带日期输入的自定义查询

javascript - 如何通过继承向现有功能添加功能

python - Python 中的 BaseException 子类问题

java - A* 实现中的逻辑缺陷

java - Objects.hashCode() 和 new Object().hashCode() 的区别?

java - 如何从请求对象中选择 JSP 中的所需按钮

java - 处理中的文本质量

java - 泛型接口(interface)方法签名 "incorrect"

inheritance - 使用函数式编程风格数据类型的模型继承

inheritance - 为什么在 systemverilog 中继承常量变量不起作用