使用Java中的局部变量隐藏实例变量

时间:2014-05-02 16:23:47

标签: java oop variables shadowing

我已经读过“如果存在另一个具有相同名称且范围更接近的变量,则变量会被遮蔽”。我发现这个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”。我是否误解了阴影变量的定义?

2 个答案:

答案 0 :(得分:5)

  

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

在构造函数中,简单名称x的含义总是只是参数。因此,构造函数中的赋值x = x将获取x参数的值,并将分配给 x参数。永远不会触及实例变量。 (我不清楚你的意思是23 = 23;,所以我不知道这是否准确。)基本上,这是一个无操作,一些IDE会给你一个警告。

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

this.x = x;

(同样对于y,当然。)

答案 1 :(得分:0)

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
}