网上的答案说创建对象时,成员变量如果没有显式赋值,则默认初始化为对应的值,如整型默认 0,String 默认 null 等等。这里的 0 和 null 是在哪里赋值给成员变量的? google 搜到一个答案说是在构造方法默认给成员变量赋初始值的。
class A{
public String n;
public A(){
this.n = null; // 如果 n 没有被显式赋值,这里被 JVM 默认添加赋值语句???
}
}
1
vjnjc 2018-06-21 10:16:05 +08:00 via Android
不是太清楚,感觉是构造函数跑完就给初始值了
|
2
ccccyu 2018-06-21 10:43:03 +08:00 2
JVM 在给对象分配内存空间时,会把所有内存空间都初始化为零值,这里的 null,0 就是其体现,而不是主动赋值产生的。分配完内存空间之后才会执行构造方法,按你的想法对字段进行赋值。参考深入理解 Java 虚拟机。
|
3
sakudie 2018-06-21 10:50:11 +08:00
成员变量的初始化 先于 构造器的初始化
|
4
BBCCBB 2018-06-21 11:26:29 +08:00
你断点调一下不就得了吗
|
5
promise2mm 2018-06-21 11:45:43 +08:00 3
类加载过程:1 加载 -> 2 链接( 2.1 验证,2.2 准备,2.3 解析) -> 3 初始化 -> 4 使用 -> 5 卸载
1 创建对象时需要 jvm 将对应的类加载到内存中,加载类的过程中有个“ 2.2 链接-准备”阶段, “准备”这个阶段会为这个类对象分配内存,根据成员变量类型分配好每个成员变量需要的空间大小,此时针对成员变量进行初始化,根据变量类型分配对应大小的空间,并初始化默认值。 2 而后的一个过程是“ 3 初始化”, 这个时候才调用类构造器<cinit>(). |
6
HackerOO7 2018-06-21 14:34:24 +08:00 via Android
五楼正解。建议看 深入理解 java 虚拟机。
|