【发布时间】:2020-12-23 13:57:14
【问题描述】:
到目前为止,我认为 effectively final 和 final 或多或少是等价的,如果在实际行为中不完全相同,JLS 会将它们视为相似的。然后我发现了这个人为的场景:
final int a = 97;
System.out.println(true ? a : 'c'); // outputs a
// versus
int a = 97;
System.out.println(true ? a : 'c'); // outputs 97
显然,JLS 在这里对两者产生了重要影响,我不知道为什么。
我读过其他类似的主题
- Difference between final and effectively final
- Effectively final variable vs final variable
- What does a variable being “effectively final” mean?
但他们没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎是等价的。但深入挖掘,它们显然不同。
是什么导致了这种行为,谁能提供一些解释这个问题的 JLS 定义?
编辑:我发现了另一个相关的场景:
final String a = "a";
System.out.println(a + "b" == "ab"); // outputs true
// versus
String a = "a";
System.out.println(a + "b" == "ab"); // outputs false
所以字符串实习在这里也表现不同(我不想在实际代码中使用这个 sn-p,只是好奇不同的行为)。
【问题讨论】:
-
非常有趣的问题!我希望 Java 在这两种情况下的行为都相同,但我现在很受启发。我在问自己这是否总是这种行为,或者它在以前的版本中是否有所不同
-
你“发现”事物的方式很有趣 :P 不客气 :)
标签: java language-lawyer final jls effectively-final