又一波 有关 java 静态代码块 代码块 构造函数执行顺序问题

时间:2021-11-17 19:29:07

父类子类都有静态成员的执行输出顺序:


父类:



public class A {


/**
* 执行顺序以及原因: 1: 静态变量优先于静态代码块执行,原因:本类中定义了一个a=10,然后 我在static代码块中
* System.out.println("静态代码块" + a); 输出的a=10,所以静态代码块优先于静态代码快(如果public static
* int a = 10;没有 优先于static代码块的话a的值应该未被赋值,默认为0,实际输出不是0)
*
* 2:输出结果以及原因
* 由于a1,a2都是静态A的成员,故在static前就被创建,构造块执行优先于构造方法,所以先输出构造快,随后输出构造方法
* 构造块 public static A a1 = new A();
* 构造函数 public static A a1 = new A();
* 构造块public static A a2 = new A();
* 构造函数public static A a2 = new A();



* 构造块:
* 直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
* 构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造方法。



* 静态成员初始化完成之后开始运行静态代码块,故输出
* 静态代码块10 
* 构造块 A a = new A();
* 构造函数 A a = new A();
*/


// 静态成员变量


public static A a1 = new A();
public static A a2 = new A();
public static int a = 10;


// 静态代码块
static {
// System.out.println("静态代码块" + a);
System.out.println("A静态代码块");
}


// 构造代码块
{
System.out.println("A构造块");
}


// 构造方法
public A() {
System.out.println("A构造函数");
}


public static void main(String[] args) {


A a = new A();
 


}


}



子类: 


public class B  extends A {
/**
* 如果B类继承A类而且B类也有静态代码块,代码块和构造方法运行顺序如下(此处不考虑有静态成员,但是main方法中创建一个子类成员对象):
* 父类静态构造块执行
* 子类静态构造块执行
* 父类代码块执行
* 子类代码块执行
* 父类构造方法执行
* 子类构造方法执行

*/
public  static B b=new B();
// 静态代码块
static {
System.out.println("B子类静态代码块");
}


// 构造代码块
{
System.out.println("B子类构造块");
}


// 构造方法
public B() {
System.out.println("B子类构造函数");
}
public static void main(String[] args) {
B b=new B();
}

}

输出结果:

又一波 有关 java 静态代码块 代码块 构造函数执行顺序问题

A构造块
A构造函数
A构造块
A构造函数
A静态代码块
A构造块
A构造函数
B子类构造块
B子类构造函数
B子类静态代码块
A构造块
A构造函数
B子类构造块
B子类构造函数