闲来无事,写了一个java成员变量初始化的顺序的小例子
[size=large]代码如下[/size]
[size=large]父类[/size]
[size=large]子类[/size]
[size=large]辅助类[/size]
[size=large]测试类[/size]
[size=large]输出结果如下[/size]
[size=large]
superclass static member is initialized
sublass static member is initialized
superclass member is initialized
superclass constructor called
subclass member is initialized
subclass contructor is called
[/size]
[size=large]总结如下:[/size]
[size=large]
当运行这个测试的时候,执行到new parrot()的时候虚拟机回加载Parrot这个类,在加载的过程中发现他继承Bird这个类,虚拟机就回去加载Bird这个类,直到没有父类,不管你创不创建父类对象,父类都会被加载到虚拟机里,然后jvm会执行父类的静态初始化(这里是Bird类)然后是派生类的静态变量初始化(可能子类的静态变量初始化要用到父类的静态成员初始化),直到所有的派生类的静态成员初始化完成,到此,所有的类都加载完了,可以创建父对象了,所有的primitive类型的被设为默认值,reference被设置成null,这个过程很快,如果有对成员变量赋值,则执行赋值,然后执行构造函数,派生类的执行给父类一样,这里不再重复。
[/size]
[size=large]代码如下[/size]
[size=large]父类[/size]
package com.own.test;
public class Bird {
private String birdColor;
private static Enemy enemy = new Enemy("superclass static member is initialized");
private int age = getAge();
public Bird(String birdColor){
this.birdColor = birdColor;
System.out.println("superclass constructor called");
}
private int getAge() {
// TODO Auto-generated method stub
System.out.println("superclass member is initialized");
return 9;
}
public Bird(){
System.out.println("Bird() constructor called ");
}
}
[size=large]子类[/size]
package com.own.test;
public class Parrot extends Bird {
private Food food = new Food("subclass member is initialized");
private static Friend friend = new Friend("sublass static member is initialized");
public Parrot(String birdColor){
super(birdColor);
System.out.println("subclass contructor is called");
}
}
[size=large]辅助类[/size]
package com.own.test;
public class Enemy {
public Enemy(String message) {
System.out.println(message);
}
}
package com.own.test;
public class Food {
public Food(String message){
System.out.println(message);
}
}
package com.own.test;
public class Friend {
public Friend(String message){
System.out.println(message);
}
}
[size=large]测试类[/size]
package test;
import org.junit.Test;
import com.own.test.Parrot;
public class MemberInitSequenceTest {
@Test
public void testInitSequence(){
Parrot p = new Parrot("green");
}
}
[size=large]输出结果如下[/size]
[size=large]
superclass static member is initialized
sublass static member is initialized
superclass member is initialized
superclass constructor called
subclass member is initialized
subclass contructor is called
[/size]
[size=large]总结如下:[/size]
[size=large]
当运行这个测试的时候,执行到new parrot()的时候虚拟机回加载Parrot这个类,在加载的过程中发现他继承Bird这个类,虚拟机就回去加载Bird这个类,直到没有父类,不管你创不创建父类对象,父类都会被加载到虚拟机里,然后jvm会执行父类的静态初始化(这里是Bird类)然后是派生类的静态变量初始化(可能子类的静态变量初始化要用到父类的静态成员初始化),直到所有的派生类的静态成员初始化完成,到此,所有的类都加载完了,可以创建父对象了,所有的primitive类型的被设为默认值,reference被设置成null,这个过程很快,如果有对成员变量赋值,则执行赋值,然后执行构造函数,派生类的执行给父类一样,这里不再重复。
[/size]