java对象初始化过程

java对象的初始化过程如下:

  1. 初始化父类的静态成员
  2. 初始化父类的静态代码块
  3. 初始化子类的静态成员
  4. 初始化子类的静态代码块
  5. 初始化父类的非静态成员
  6. 初始化父类的非静态代码块
  7. 初始化父类的构造方法
  8. 初始化子类的非静态成员
  9. 初始化子类的非静态代码块
  10. 初始化子类的构造方法

也就是说静态成员和静态代码块优先执行(静态成员随着类加载而加载优先),接着才是非静态成员。构造方法最后执行。注意:存在着显式初始化和默认初始化。 默认初始化指的是假如成员变量为int,就默认值为0,成员变量为对象,就默认为空,

然后执行显式初始化或构造代码块(看那个放在前面)

class Fu{
	/**
	   注意:当创建子类对象时,找到父类,内存中有两个num 先对num进行了默认初始化,num =0,
	   紧接着由于下面语句对父类的num进行了显式初始化,num=9,子类的num仍旧为0(当然了,
	   构造代码块若放在显式初始化前面的话,先执行构造代码块)
	*/
	int num =9; // 显式初始化为9
	{
		System.out.println("Fu constructor code.." +num);
	}

	Fu(){
		super();
		// 显式初始化
		//构造代码块初始化
		System.out.println("fu constructor run");
		show();
	}
	void show(){
		System.out.println("fu show ..." + num);
	}
}

class Zi extends Fu{
	int num=8;

	// 构造代码块
	{
		System.out.println("zi constructor code ..."+ num);
	}
  
	//子类构造函数
	Zi(){
		super() ;
		 // 显式初始化
		System.out.println("zi constructor "+num);
	}

	void show(){
		System.out.println("zi show .." +num);
	}
}
public class Test{
	public static void main(String[] agrs){
		new Zi();
	}
}

其运行结果如下:

Fu constructor code..9
fu constructor run
zi show ..0
zi constructor code ...8
zi constructor 8
当在main函数中创建子类对象时,先去加载父类,先将父类的num显式初始化为9(默认初始化为0最先执行),然后执行构造代码块,打印出内容。然后执行父类的无参构造方法,注意当调用show()方法时,因为子类也有show()方法,就去执行了子类的show(),但是由于子类的num仅仅被默认初始化为0,所以打印出的结果为 zi show .. 0。当执行完父类的构造方法后,进入子类执行显式初始化,此时,子类的num被赋值为8,并又执行了构造代码块,打印   zi constructor code ...8 ,最后执行完了子类的构造函数,对象创建完成。


猜你喜欢

转载自blog.csdn.net/m0_37564404/article/details/80183977