【发布时间】:2012-03-26 17:12:33
【问题描述】:
这是问题的延伸:Order of the initialization in Java
所以在代码块中:
public class Point {
int y = getX();
int x = 42;
int getX() {
return x;
}
public static void main (String s[]) {
Point p = new Point();
System.out.println(p.x + "," + p.y);
}
}
它输出42,0
虽然上面的问题是通过描述 Java 编译器和运行时的行为来回答的,但它仍然困扰着我为什么编译器不将 x (42) 的初始值烘焙到字节码中? 我知道静态变量的值被嵌入到字节码中,因为它们是类级别的变量并且它们不占用对象内存中的任何空间,但是也为类级别的非静态变量嵌入任何初始值是否有意义也进入字节码?这样,上面的代码将更符合预期的行为,并且我猜测对象的实例化会更快(因为分配给 x 的内存将立即包含 42 因此节省解析类中初始化行的时间每次创建 Point 类的对象时)
我怀疑这可能与类字节码大小、对象初始化效率和编译时间效率之间的权衡有关。
我希望对 Java 编译器/运行时有深入了解的人可以对此有所了解。 了解框架内部的工作原理总能帮助我们编写更好的代码:-)
【问题讨论】:
-
如果变量是对象会不会产生问题?当值为 42 时一切都很好,但如果该值是类 ComplexNumber 的对象怎么办?我们是否希望我们的所有点都引用相同的内存地址,并且本质上是相同的 ComplexNumber?现在我不是对 Java 编译器/运行时知识有深入了解的人,所以我在这里可能完全错了,但这是我能想到的最好理由。
-
它确实“将 x (42) 的初始值写入字节码”。你认为 x 怎么会变成 42 岁?在创建实例之前,它不会将其烘焙到 实例内存,因为没有实例内存。在运行时。你的问题没有意义。