3

在 Java 中,我知道可以执行以下操作:

public class Greeter {
    public void greetEventually() {
        final String greeting = "Hello!";
        Job j = new Job() {
            public void run() {
                System.out.println(greeting);
            }
        };
        j.schedule();
    }
}

Job这将在将来的某个时候执行匿名。这是因为允许匿名类引用封闭范围内的最终变量。

我不确定的是以下情况:

public class Greeter {
    private String greeting;

    // ... Other methods that might mutate greeting ...

    public void greetEventually() {
        Job j = new Job() {
            public void run() {
                System.out.println(greeting);
            }
        };
        j.schedule();
    }
}

在这种情况下,我的匿名Job是指封闭类的非最终字段。当作业运行时,我会看到greeting创建作业时的字段值,还是执行时的值?我想我知道答案,但我认为这是一个有趣的问题,起初它让我和几个同事怀疑自己几分钟。

4

3 回答 3

9

您将看到匿名执行greeting时的原样值。Job

只有final局部变量需要修饰符,成员变量不需要。

于 2010-02-12T01:11:16.790 回答
1

您正在通过 (outer) 访问该字段this。您可以将其this视为有效的final局部变量。只有局部是final,指向的对象不是(必然)恒定的。想象一个具有相同值的局部变量,this它应该很清楚。

public class Greeter {
    private String greeting;

    // ... Other methods that might mutate greeting ...

    public void greetEventually() {

        private final Greeter greeter = this; // <---

        Job j = new Job() {
            public void run() {
                System.out.println(   greeter.greeting   ); // <---
            }
        };
        j.schedule();
    }
}
于 2010-02-12T08:48:08.723 回答
-1

final修饰符应用于局部变量只是为了为内部类的每个实例提供变量,所以我们使用:final String greeting;

当您只需要一个变量实例时(如常量或公共资源的情况),请使用:private String greeting;

于 2010-02-12T01:38:46.657 回答