使用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 }