java 对象成员变量初始化顺序
对象成员变量指非static的变量,static的变量一般称为类成员变量,它们伴随着类的加载而初始化。
package com.juneny.foundation;
public class InitSeqOfObj {
ForSeqOfObjTest f1 = new ForSeqOfObjTest("create obj 1");
ForSeqOfObjTest f2 = new ForSeqOfObjTest("create obj 2");
public static void main(String[] args) {
InitSeqOfObj i = new InitSeqOfObj();
}
}
class ForSeqOfObjTest {
public ForSeqOfObjTest(String msg) {
System.out.println(msg);
}
}
运行,输出信息如下:
create obj 1
create obj 2
和定义的顺序保持一致。
总结
java 对象的成员变量的初始化顺序和定义的顺序一致。java 类成员的初始化顺序也遵循这个原则,先定义的先初始化,非常符合人的认知习惯。
以上只是独立的对象,如果有父类呢? 我大胆猜测一下,由于继承关系只是继承父类的接口,即方法,所以,当子类实例化时,父类的对象成员变量不会被初始化。
还是做个实验吧:
package com.juneny.foundation;
class parentOfInitSeqOfObj{
ForSeqOfObjTest f1 = new ForSeqOfObjTest("Parent create obj 1");
}
public class InitSeqOfObj extends parentOfInitSeqOfObj{
ForSeqOfObjTest f1 = new ForSeqOfObjTest("create obj 1");
ForSeqOfObjTest f2 = new ForSeqOfObjTest("create obj 2");
public static void main(String[] args) {
InitSeqOfObj i = new InitSeqOfObj();
}
}
class ForSeqOfObjTest {
public ForSeqOfObjTest(String msg) {
System.out.println(msg);
}
}
结果让我大跌眼镜:
Parent create obj 1
create obj 1
create obj 2
看来,并非是我想象的那样。不过,这也说的通。 因为毕竟父对象需要随时向子对象提供自己的变量,
super.f1
在初始化子对象的时候,同时初始化父类的成员变量,也保证了随时能向子对象提供变量引用的能力。
以上。