java成员变量初始化顺序

闲来无事,写了一个java成员变量初始化的顺序的小例子
代码如下
父类

    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 ");
	}
	
}



子类
 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");
	}
	
	
}


辅助类
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);
	}
	
}



测试类

 package test;

import org.junit.Test;

import com.own.test.Parrot;

public class MemberInitSequenceTest {
    
	@Test
	public void testInitSequence(){
		Parrot p = new Parrot("green");
	}
	
}



输出结果如下
 
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

总结如下:

当运行这个测试的时候,执行到new parrot()的时候虚拟机回加载Parrot这个类,在加载的过程中发现他继承Bird这个类,虚拟机就回去加载Bird这个类,直到没有父类,不管你创不创建父类对象,父类都会被加载到虚拟机里,然后jvm会执行父类的静态初始化(这里是Bird类)然后是派生类的静态变量初始化(可能子类的静态变量初始化要用到父类的静态成员初始化),直到所有的派生类的静态成员初始化完成,到此,所有的类都加载完了,可以创建父对象了,所有的primitive类型的被设为默认值,reference被设置成null,这个过程很快,如果有对成员变量赋值,则执行赋值,然后执行构造函数,派生类的执行给父类一样,这里不再重复。

你可能感兴趣的:(java)