java - 我的问题直接而简单 x 的值在这里返回 5 但为什么这背后的原因是什么

标签 java inheritance polymorphism core

<分区>

这里的输出是 = 5 但不是 15 为什么 根据代码将x的值修改为15

class A {
    int x = 5;

    public int getX() {
        return this.x;
    }

    public void setX(int x) {
        this.x = x;
    }

}

class B extends A {
    int x = 10;

    public B() {
        this.x = 15;
    }

}

public class Test {
    public static void main(String[] args) {
        B a = new B();
        System.out.println("hello" + a.getX());
    }
}

是不是因为变量的作用域

最佳答案

您在 B 中再次重新声明了 x:

class B extends A {
    int x = 10; // <--- here

这将创建两个名为 x 的字段。从现在开始,我将它们称为 A.xB.x。请注意,B.x 隐藏了 A.x。这意味着如果变量的编译时类型是A,你只能访问A.x,而如果编译时类型是B,您只能访问 B.x

当您执行 new B() 时,A.x 会初始化为 5B.x 在构造函数中设置为 15。到目前为止很简单。

但随后您调用了 getX()。请注意,这是 A 中的一个方法。它不知道 B.x 的存在,因为在它内部,this 的编译时类型是 A。因此,getX 中,this.x 表示 A.x。这就是返回 5 的原因。

要输出15,你可以直接访问B.x:

System.out.println(a.x);

或者,B 可以覆盖 A.getXA.setX 以返回并设置 B.x:

class B extends A {
    int x = 10;

    public B() {
        this.x = 15;
    }

    @Override
    public int getX() {
        return x;
    }

    @Override
    public void setX(int x) {
        this.x = x;
    }
}

关于java - 我的问题直接而简单 x 的值在这里返回 5 但为什么这背后的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52177692/

相关文章:

ruby-on-rails - 在 rails 模型中覆盖 to_s ...可能吗?

java - java 中的 std::wstring sFile

Java:将一个对象扩展到另一个对象

java - 通用接口(interface)或通用子类

javascript - JavaScript 中的函数式编程是否可以具有任何类型的多态性?

Java Swing - 添加行 # 列(行标题)到 JTable

java - 卡片 View 未出现在 RecyclerView 中

java - 目标类型具有通配符时的泛型方法类型推断

java - Java分布式Master-Worker架构仿真设计

java - 如何在Java中使用单应方法实现接口(interface)?