java构造函数和初始化函数的执行顺序

1,静态变量、静态代码块、变量、普通代码块、mian方法、构造函数的执行顺序是:(静态变量、静态代码块)>    main方法 >(变量、普通代码块)>构造函数。

2,如果子类调用了父类,那么执行顺序是:(父类静态变量、父类静态代码块)>(子类静态变量、子类静态代码块)> main方法 >(父类变量、父类代码块)> 父类构造方法 >(子类变量、子类代码块)> 子类构造方法

3,子类继承父类简单举例说明:也就是说此时的运行顺序为:

  1.   父类静态块
  2.   自身静态块
  3.   父类块
  4.   父类构造器
  5.   自身块
  6.   自身构造器

/**
 * 测试父类和子类代码执行顺序
 */
public class Father1 {
	
	/**
	 * 父类静态代码块
	 */
	static {
		System.out.println("父类1静态代码块");
	}
	
	/**
	 * 父类块
	 */
	{
		System.out.println("父1类块");
	}
	
	/**
	 * 父类构造方法
	 */
	public Father1(){
		System.out.println("父1类构造方法");
	}
	
	
}

子类代码:

/**
 * 测试父类和子类代码执行顺序
 */
public class Child1 extends Father1{
	
	/**
	 * 子类静态代码块
	 */
	static {
		System.out.println("子1类静态代码块");
	}
	
	/**
	 * 子类代码块
	 */
	{
		System.out.println("子1类块");
	}
	
	/**
	 * 子类构造方法
	 */
	public Child1() {
		System.out.println("子1类构造方法");
	}
	
	public static void main(String args[]){
		System.out.println("main1方法");
		/**
		 * 实例化
		 */
		Child1 c = new Child1();
	}
}

执行结果是:

父类1静态代码块
子1类静态代码块
main1方法
父1类块
父1类构造方法
子1类块
子1类构造方法

4,子类2集成父类2,并且在类中实例化父类1。通过下面的例子可以知道静态变量和静态代码块的执行顺序,是按照他们在类中的顺序来执行的。那么执行顺序会是:父类2的静态--子类2的静态--main方法--父类2的常量--父类2的构造--子类2的常量--父类1的静态--父类1的常量-父类1的构造--子类2的构造。也就是说此时的运行顺序为:

  1.   父类2静态块
  2.   自身静态块
  3.   父类2块
  4.   父类2构造器
  5.   自身块
  6.   父类1静态块
  7.   父类1块
  8.   父类1构造器
  9.   自身构造器

父类

/**
 * 测试父类和子类代码执行顺序
 */
public class Father2 {
	
	
	public static String F_STATIC_FILED = "父2类静态变量";
	
	public String F_FILED = "父2类普通变量";
	
	/**
	 * 父类静态代码块
	 */
	static {
		System.out.println(F_STATIC_FILED);
		System.out.println("父2类静态代码块");
	}
	
	/**
	 * 父类块
	 */
	{
		System.out.println(F_FILED);
		System.out.println("父2类块");
	}
	
	/**
	 * 父类普通方法
	 */
	public void f_method(){
		System.out.println("父2类普通方法");
	}
	
	/**
	 * 父类构造方法
	 */
	public Father2(){
		System.out.println("父2类构造方法");
	}
	
	
}

子类:

/**
 * 测试父类和子类代码执行顺序
 */
public class Child2 extends Father2{
	
	public static String C_STATIC_FILED = "子2类静态变量";
	
	public String C_FILED = "子2类普通变量";
	
	/**
	 * 子类静态代码块
	 */
	static {
		System.out.println(C_STATIC_FILED+"cccc");
		System.out.println("子2类静态代码块");
	}
	
	/**
	 * 子类代码块
	 */
	{
		System.out.println("子2类块");
	}
	
	/**
	 * 子类构造方法
	 */
	public Child2() {
		System.out.println("子2类构造方法");
	}
	
	public static void main(String args[]){
		System.out.println("main2方法");
		/**
		 * 实例化
		 */
		Child2 c = new Child2();
	}
	Father1 f2 = new Father1();
}

执行结果是:

父2类静态变量
父2类静态代码块
子2类静态变量
子2类静态代码块
main2方法
父2类普通变量
父2类块
父2类构造方法
子2类块
父类1静态代码块
父1类块
父1类构造方法
子2类构造方法

5:总结如下:

类初始化时构造函数调用顺序:
  (1)初始化对象的存储空间为零或null值;
  (2)调用父类构造函数;
  (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
  (4)调用本身构造函数

在我们的程序中,实例化一个类对象的时候,运行顺序为:

  1.  父类静态块
  2.  父类构造器
  3.  本类中的块
  4.  本类的构造器



猜你喜欢

转载自blog.csdn.net/u012138706/article/details/38371329