当传递一个最终对象(下面代码中的字符串)时,它在从匿名内部类打印时显示为 null。但是,当传入最终值类型或直接最终字符串时,它的值会正确显示。在匿名内部类的上下文中真正意味着什么final
以及为什么对象传递为 null?
public class WeirdInners
{
public class InnerThing
{
public InnerThing()
{
print();
}
public void print(){
}
}
public WeirdInners()
{
final String aString = "argh!".toString();
final String bString = "argh!";
System.out.println(aString);
System.out.println(bString);
InnerThing inner =new InnerThing(){
public void print()
{
System.out.println("inner"+aString); // When called from constructor, this value is null.
System.out.println("inner"+bString); // This value is correctly printed.
}
};
inner.print();
}
public static void main(String[] args)
{
WeirdInners test1 = new WeirdInners();
}
}
这对我来说是非常奇怪的行为,因为期望 String是一个对象,为什么调用toString()
会改变事情?
其他信息:此行为仅在使用 Java 1.4 时观察到,而不是在 Java 5 中。关于解决方法的任何建议?不调用toString()
现有的 String 是很公平的,但由于这只是一个示例,如果我在非 String 对象上执行它,它就会对现实世界产生影响。