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

时间:2009-07-07 12:43:53

标签: java shadowing

我正在阅读我的Deitel,Java How to Program一书,并且遇到了 shadowing 一词。如果允许阴影,那么在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);
    }
}

5 个答案:

答案 0 :(得分:36)

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

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

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

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

答案 1 :(得分:13)

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

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

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

答案 2 :(得分:9)

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

答案 3 :(得分:5)

阴影实际上不是一个仅限java的术语。在范围中声明的变量与更大范围中的变量具有相同名称的任何情况下,该变量都被遮蔽。

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

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

答案 4 :(得分:2)

两个常见用途是构造函数和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();
    }
}

(当然,一个人为的例子不需要使用豪华循环。)