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

Java中用局部变量隐藏实例变量,java,oop,variables,shadowing,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

我读过“如果有另一个同名变量的作用域更近,则该变量将被隐藏”。我找到了这个带有构造函数的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
,也是如此。)

我认为构造函数中的“x=x”类似于“23=23”

在构造函数中,简单名称
x
的含义始终只是参数。因此,构造函数中的赋值
x=x
x
参数的值,并将其赋值给
x
参数。实例变量永远不会被触及。(不清楚你所说的
23=23;
是什么意思,所以我不知道这是否准确。)基本上,这是一个禁止操作的选项,一些IDE会给你一个警告

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

this.x = x;

(当然,对于
y
,也是如此。)

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
}

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
}

不,它的意思是“局部
x
点的一个参数
正在隐藏类成员
x
”,因此您正在隐藏一个名为与外部范围中的变量相同的变量。您是对的,x(23)获得值23,但该值23不存储在类中。你只需将它发送给Constructor,然后将其忘在那里。创建点后要打印originOne.x时,会打印该类变量的值(0)否,它的意思是“作为点的参数的本地
x
正在隐藏类成员
x
”因此,您隐藏了一个名为与外部作用域中的变量相同的变量。您是对的,x(23)得到了值23,但该值23不存储在类中。你只需将它发送给Constructor,然后将其忘在那里。创建点后要打印originOne.x时,会打印该类变量的值(0),但创建对象后参数
x
的值不等于
23
?如果我打印出的
x
x
参数(23)的值,为什么它仍然打印出0?Nvm我的注释,我现在得到:)ty。但是创建对象后参数
x
的值不等于
23
?如果我打印出采用
x
参数(23)值的
x
,为什么它仍然打印出0?Nvm我的注释,我现在得到它:)ty。