gpt4 book ai didi

java - 传入匿名内部类时为空对象

转载 作者:行者123 更新时间:2023-11-30 06:38:56 24 4
gpt4 key购买 nike

当传递最终对象(下面代码中的字符串)时,它在从匿名内部类打印时显示为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com