26

我正在阅读我的 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);
    }
}
4

5 回答 5

41

阴影的基本目的是将本地代码与周围的类解耦。如果它不可用,请考虑以下情况。

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

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

但是,不要故意这样做。仅当您真的不关心范围之外发生的事情时才让这种情况发生。

于 2009-07-07T12:56:01.070 回答
16

对于不想为方法参数创建单独的变量名的设置器,它可能很有用,例如:

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

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

于 2009-07-07T12:45:52.930 回答
10

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

于 2009-07-07T12:44:50.777 回答
5

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

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

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

于 2009-07-07T12:47:14.117 回答
3

两个常见的用途是构造函数和设置方法:

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();
    }
}

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

于 2009-07-07T13:02:14.530 回答