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

变量阴影在Java类中的作用是什么?,java,shadowing,Java,Shadowing,我在读我的Deitel,Java How to Program(Java如何编程)一书,偶然发现了“阴影”一词。如果允许阴影,在Java类中有什么情况或用途 例如: public class Foo { int x = 5; public void useField() { System.out.println(this.x); } public void useLocal() { int x = 10; Sys

我在读我的Deitel,Java How to Program(Java如何编程)一书,偶然发现了“阴影”一词。如果允许阴影,在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);
    }
}

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

对于不希望仅为方法参数创建单独变量名的setter来说,这很有用,例如:

public void setX(int x) {
    this.x = x;
}

除此之外,我会避免使用它们。

阴影并不是一个真正的java专用术语。在任何情况下,如果在一个作用域中声明的变量与在更大作用域中声明的变量具有相同的名称,则该变量将被隐藏

阴影的一些常见用途是当您有内部和外部类,并且希望维护具有相同名称的变量时


但是,如果可以避免,应该避免,因为它可能会引起混淆。

隐藏的基本目的是将本地代码与周围的类解耦。如果它不可用,那么考虑下面的情况。< /P> API中的类Foo已发布。在您的代码中,您可以对其进行子类化,并且在子类中使用名为bar的变量。然后Foo发布一个更新,并将一个名为Bar的受保护变量添加到其类中

现在你的班级因为一场你无法预料的冲突而无法参加


但是,不要故意这样做。只有当您真正不关心范围外发生的事情时,才允许这种情况发生。

两种常见用法是构造函数和set方法:

public Foo(int x) {
    this.x = x;
}

public void setX(int x) {
    this.x = x;
}
如果您希望在一个瞬间获得变量的副本,那么它有时非常有用,但是变量可能会在方法调用中更改

private void fire() {
    Listener[] listeners = this.listeners;
    int num = listeners.length;
    for (int ct=0; ct<num; ++ct) {
        listeners[ct].stateChanged();
    }
}
private void fire(){
Listener[]listeners=this.listeners;
int num=listeners.length;

例如(int-ct=0;ctI喜欢您的最后一点“只有当您真的不关心范围外发生的事情时,才允许这种情况发生。”…当您的实例变量值出现异常时,您将知道何时开始关心:)))无论如何,在设置实例变量值的方法中始终使用this.variable_名称是一种很好的做法……这是对变量进行阴影处理的一个糟糕原因。阴影处理总是会使您面临潜在错误,使用范围信息命名变量以及更改参数名称比包括“这个”每一次。对于一个简单的setter,就像上面的例子一样,我认为它很好,重命名参数会让事情变得丑陋。任何比这更复杂的事情,我同意,完全避免。这两种情况都不需要阴影。@Rick没有人说它是必要的。阴影是不必要的。我是说,一个人永远不应该忘记adow。只需以不同的方式命名变量。@Rick这是一个风格问题。惯例是你应该使用阴影。不幸的是,这种风格使得-Wshadow等工具的使用更加困难。不要选择风格而不是健壮性。你能进一步解释一下这个.x=x是如何让人困惑的吗?