繁体   English   中英

用Java中的局部变量遮盖实例变量

[英]Shadowing instance variables with local variables in Java

我已经读过“如果一个变量的作用域更近,则该变量将被遮盖”。 我发现此Point类带有一个构造函数作为示例:

public class Point {
    public int x = 0;
    public int y = 0;

    public Point(int x, int y) {
        x = x;
        y = y;
    }
}

然后,我在下面的CreateObjectDemo类中创建了Point类的对象,并打印了变量x的值。

public class CreateObjectDemo {
    public static void main(String[] args) {

    Point originOne = new Point(23, 94);

    System.out.println(originOne.x);

    }

}

运行编译器后,它显示0。但是为什么不显示23? 我认为构造函数中的“ x = x”就像“ 23 = 23” 我是否误解了阴影变量的定义?

我认为构造函数中的“ x = x”就像“ 23 = 23”。

在构造函数中,简单名称x的含义始终只是参数。 因此,分配x = x的构造函数将值x参数,并将其分配 x参数为好。 实例变量永远不会被触及。 (尚不清楚23 = 23;意思,因此我无法确定这是否正确。)基本上,这是一个禁忌,某些IDE会向您发出警告。

要强制将其复制到实例变量,您需要:

this.x = x;

(当然,对于y同样如此。)

0int类型变量的默认值,并且如警告所言,您在构造函数中隐藏了变量,因此从未将对象变量分配给该变量。

public Point(int x, int y) {
    x = x; //assign value of local x to local x
    y = y; //assign value of local y to local y
}

您需要使用this关键字来引用对象变量xy而不是局部变量:

public Point(int x, int y) {
    this.x = x; //assign value of local x to object variable x
    this.y = y; //assign value of local y to object variable y
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM