【发布时间】:2009-10-28 20:43:49
【问题描述】:
当传递一个最终对象(下面代码中的字符串)时,它在从匿名内部类打印时显示为 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();
}
}
这对我来说是非常奇怪的行为,因为期望字符串 是 一个对象,为什么调用 toString() 会改变事情?
其他信息:此行为仅在 Java 1.4 中观察到,在 Java 5 中未观察到。有关解决方法的任何建议?不在现有 String 上调用 toString() 是很公平的,但由于这只是一个示例,如果我在非 String 对象上执行它会影响现实世界。
【问题讨论】:
-
您在 Java 1.4 下看到了什么结果?我正在使用 Java 6,我得到了(可能无法很好地格式化并且没有 cmets 的预览):啊!啊!内拉!内拉!内拉!内拉!并不是说它对您有任何帮助,但 Java 1.4 的 EOL 通知于 2006 年 12 月宣布,而 Java 1.4 的 EOSL 是一年前的这个星期五。 Java 5 的 EOL 通知于 2008 年 4 月发布,并于本周五达到其 EOSL。您有机会升级到 Java 6 吗? java.sun.com/products/archive/eol.policy.html
-
您看到了预期的输出。使用 "argh!".toString(); 时 1.4 的行为是 innernull。
标签: java inner-classes java1.4