Java中static代码块,{}大括号代码块,构造方法代码块执行顺序!

注:下列代码中的注释都是JUnit4单元测试运行结果。

首先,没有父类的(父类是Object)的类A

package Static.of;

public class A {

    {
        System.out.println("我是父类-----大括号中的代码");
    }
    
    static{
        System.out.println("我是父类-------static代码块");
    }
    
    public A(){
        System.out.println("我是父类A----------的构造方法");
    }

}
@Test 
    public void fathClass(){
        A a = new A();//父类
        /**
         *  我是父类-------static代码块
            我是父类-----大括号中的代码
            我是父类A----------的构造方法
         */
    }

由上面运行结果可知:只要没有父类(只有Object作为父类)那么执行顺序:static代码块,大括号,构造方法。

继承A的类B

package Static.of;

public class B extends A {
	{
		System.out.println("我是子类大括号中的代码");
	}
	
	static{
		System.out.println("我是子类static代码块");
	}
	
	public B(){
		System.out.println("我是子类B的构造方法");
	}
}

  继承A的类C

package Static.of;

public class C extends A {
	{
		System.out.println("我是C类 中的大括号");
	}
	
	public C (){
		System.out.println("我是C中的构造方法");
	}
}

 

@Test
public void sonBClass(){
B b = new B();
/**
* 我是父类-------static代码块
我是子类static代码块
我是父类-----大括号中的代码
我是父类A----------的构造方法
我是子类大括号中的代码
我是子类B的构造方法

*/

}

  

@Test
	public void sonCClass(){
		C c = new C();
		/**
		 *  我是父类-------static代码块
			我是父类-----大括号中的代码
			我是父类A----------的构造方法
			我是C类 中的大括号
			我是C中的构造方法
		 */
	}

  

 

多态语法创建对象

	@Test
	public void polymorphicAB(){
		A a = new B();
		/**
		 *  我是父类-------static代码块
			我是子类static代码块
			我是父类-----大括号中的代码
			我是父类A----------的构造方法
			我是子类大括号中的代码
			我是子类B的构造方法
		 */
	}
	@Test
	public void polymorphicAC(){
		A a = new C();
		/**
		 *  我是父类-------static代码块
			我是父类-----大括号中的代码
			我是父类A----------的构造方法
			我是C类 中的大括号
			我是C中的构造方法
		 */
	
	}

  

根据例子总结
结果是集合{父类static,子类static,父类大括号,父类构造函数,子类大括号,子类构造函数}的一个子集

 

{}大括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前!其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!! 好处是可以提高初始化块的复用,提高整个应用的可维护性。

原文地址:https://www.cnblogs.com/theRhyme/p/7538020.html