我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

这里的输出是= 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());
    }
}

是因为变量的范围

答案

你在x再次重新宣布了B

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;
    }
}
另一答案

a.getX()调用超类的get方法,从而在类A中返回x的值。

在B类中添加getter时,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 int getX() {
        return this.x;
    }

}

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

您不能重新初始化存在于超类中的子类中的变量。这样,当获取x时,它将返回超类的x值而不是子类的值。所以在B级而不是int x = 10使用x = 10

另一答案

getX()未在类B中定义,因此它将引用超类作为方法的引用,因为引用在超类中找到它将执行超类的方法getX()。

如果在B类中添加getX(),则会执行相同的操作。

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 int getX() {
        return this.x;
    }

}

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

结果15。

以上是关于我的问题很简单,x的值在这里返回5,但为什么这个[重复]背后的原因是什么?的主要内容,如果未能解决你的问题,请参考以下文章

我的变量的值在另一个文件中发生变化

在设置表单上设置默认值在 Octobercms 中返回 null

为啥我的值在运行我的函数后没有改变? [复制]

mern - 更新后的值在数据中为空

为啥当我输入整数数据时,它的值在 Codeigniter 中总是四舍五入

R:如果另一个向量中的值在 x 和 y 之间,则范围之间的随机数