作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当传递最终对象(下面代码中的字符串)时,它在从匿名内部类打印时显示为 null。但是,当传入最终值类型或直接最终 String 时,它的值会正确显示。 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 对象执行它,它会对现实世界产生影响。
最佳答案
如果您查看 JLS 中有关编译时常量
的部分,您会发现调用 .toString()
确实有所不同。就像前缀 false?null+"":
这样的废话一样。
这里重要的是设置关闭的字段和构造函数的相对顺序。如果您使用 -target 1.4
或更高版本(这不是 1.4 中的默认设置!),那么在调用 super 之前将复制这些字段。对于 1.3 之前的规范,这是非法的字节码。
在这些情况下,javap -c
通常用于查看 javac 编译器正在做什么。该规范有助于理解原因(如果您有足够的耐心)。
关于java - 传入匿名内部类时为空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639986/
我是一名优秀的程序员,十分优秀!