gpt4 book ai didi

java - 为什么阴影会影响 `final` 行为?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:25:10 25 4
gpt4 key购买 nike

这里有三个 SSCCE,我认为它们应该编译并表现相同。我唯一要更改的是第一行“run”。

图表 1

public class FinalExperiment {
private TinyThing thing;

public static void main(String[] args) {
FinalExperiment instance = new FinalExperiment();
instance.run();
}

public void run() {
final TinyThing thing = new TinyThing();
System.out.println("Got a thing here: " + thing);
}

private static class TinyThing {
public TinyThing() {}
public String toString() { return "Hello!"; }
}
}

这行得通;它编译成功,并打印:“Got a thing here: Hello!”

图表 2

public class FinalExperiment {
private TinyThing thing;

public static void main(String[] args) {
FinalExperiment instance = new FinalExperiment();
instance.run();
}

public void run() {
final TinyThing otherThing = thing;
System.out.println("Got a thing here: " + otherThing);
}

private static class TinyThing {
public TinyThing() {}
public String toString() { return "Hello!"; }
}
}

这行得通;它编译成功,并打印:“Got a thing here: null”

图表 3

public class FinalExperiment {
private TinyThing thing;

public static void main(String[] args) {
FinalExperiment instance = new FinalExperiment();
instance.run();
}

public void run() {
final TinyThing thing = thing;
System.out.println("Got a thing here: " + thing);
}

private static class TinyThing {
public TinyThing() {}
public String toString() { return "Hello!"; }
}
}

编译失败并显示以下消息:

FinalExperiment.java:10: error: variable thing might not have been initialized
final TinyThing thing = thing;
^
1 error

为什么?图表 2 和图表 3 之间的唯一区别是我在我的 run 方法中隐藏了 thing。编译器似乎不应该因为正在发生阴影而更关心。

最佳答案

是的,图表 3 中出现了阴影,但实际上您是在尝试声明一个 final 变量,然后将其分配给自身。

final TinyThing thing = thing;  // Assign to self!

它还没有被赋值,所以你会得到它没有被初始化的编译器错误。无论局部变量 thing 是否为 final,都会发生这种情况。

要引用实例变量,请使用 this 对其进行限定。

final TinyThing thing = this.thing;  // Bypass shadowing.

这编译并导致与图表 2 相同的输出:

Got a thing here: null

这个例子无法以同样的方式编译,例如:

public class SelfDefineExample {
public static void main(String[] args) {
int i = i;
}
}

关于java - 为什么阴影会影响 `final` 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com