天道酬勤,学无止境

在 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" 。 我误解了阴影变量的定义吗?

回答1

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

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

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

this.x = x;

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

回答2

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
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐