我有这样的代码:
public class App {
private final String some;
public App(){
some = "old";
}
public static void main(String... args) throws NoSuchFieldException, IllegalAccessException {
App a = new App();
a.magic();
System.out.println(a.some);
}
private void magic() throws NoSuchFieldException, IllegalAccessException {
Field field = this.getClass().getDeclaredField("some");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(this, "new");
String someDuplicate = (String) field.get(this);
System.out.println(someDuplicate);
}
}
Run Code Online (Sandbox Code Playgroud)
这个输出将是
new
new
Run Code Online (Sandbox Code Playgroud)
但如果我将变量初始化更改为:
private final String some = "old";
Run Code Online (Sandbox Code Playgroud)
输出将是
new
old
Run Code Online (Sandbox Code Playgroud)
看起来像内联初始化会导致最终非静态字段的静态行为
我找不到这种行为的任何码头参考,可能有一些合理的解释.
顺便说一句,init方式的这种方式会导致类似于构造函数初始化的行为:
{ …Run Code Online (Sandbox Code Playgroud)