什么是Java类中使用的变量阴影?

Jay*_*son 23 java shadowing

我正在阅读我的Deitel,Java How to Program一书,并且遇到了阴影这个词.如果允许阴影,Java类中的情况或用途是什么?

例:

public class Foo {

    int x = 5;

    public void useField() {
        System.out.println(this.x);
    }
    public void useLocal() {
        int x = 10;
        System.out.println(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

Yis*_*hai 36

阴影的基本目的是将本地代码与周围的类分离.如果没有,请考虑以下情况.

API中的Class Foo已发布.在您的代码中,您将其子类化,并在子类中使用名为bar的变量.然后Foo发布更新并将一个名为Bar的受保护变量添加到其类中.

现在,由于您无法预料到的冲突,您的课程将无法运行.

但是,不要故意这样做.只有当你真的不关心范围之外发生的事情时才会发生这种情况.

  • 我喜欢你的最后一点"只有当你真的不关心范围之外发生的事情时才会发生这种情况." ...你知道什么时候开始关心什么时候开始使用你的实例变量值奇怪的东西:)))无论如何,总是在方法中使用this.variable_name设置实例的值是一个好习惯变量... (8认同)

Tom*_*rys 13

它对于您不希望仅为方法参数创建单独的变量名称的setter非常有用,例如:

public void setX(int x) {
    this.x = x;
}
Run Code Online (Sandbox Code Playgroud)

除此之外,我会避免它们.

  • 对于一个简单的setter,就像上面的例子我认为没关系,重命名参数会让事情变得丑陋.我同意,比这更复杂的事情,完全避免. (4认同)

Rob*_*anu 9

一个主要目的是让人迷惑.这是不好的做法,应该避免.

  • 你能进一步解释一下this.x = x是如何令人困惑的吗? (8认同)

z *_* - 5

阴影不是真正的java术语.在范围中声明的变量与更大范围中的变量具有相同名称的任何实例中,该变量都是阴影.

阴影的一些常见用途是当你有内部类和外部类并且想要维护具有相同名称的变量时.

如果你可以避免它,你应该因为它可能会引起混淆.