我已经读过“如果存在另一个具有相同名称且范围更接近的变量,则变量会被遮蔽”。我发现这个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”。我是否误解了阴影变量的定义?
答案 0 :(得分:5)
我认为构造函数中的“x = x”就像“23 = 23”。
在构造函数中,简单名称x
的含义总是只是参数。因此,构造函数中的赋值x = x
将获取x
参数的值,并将分配给 x
参数。永远不会触及实例变量。 (我不清楚你的意思是23 = 23;
,所以我不知道这是否准确。)基本上,这是一个无操作,一些IDE会给你一个警告。
要强制它复制到实例变量,您需要:
this.x = x;
(同样对于y
,当然。)
答案 1 :(得分:0)
0
是int
类型变量的默认值,并且如警告所示,您在构造函数中隐藏变量,因此永远不会将对象变量赋值给。
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
关键字来引用对象变量x
和y
而不是局部变量:
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
}