形如
static{
//code
}
称为静态代码块
{
//code
}
不加static修饰的是初始化代码块
总体执行顺序为:
1.父类先于子类
2.变量(属性)先于方法
3.静态先于非静态
以下提供一个实例:
import java.io.*;
import java.util.*;
public class Main extends Parent{
public static String ss="子类静态变量";
public String sf="子类变量";
private int sc=initc2();
int initc2(){
System.out.println("3.子类成员变量赋值:---> sc的值"+sc);
this.sc=12;
System.out.println("3.子类成员变量赋值:---> sc的值"+sc);
return sc;
}
static{
System.out.println(ss);
System.out.println("子类静态初始化块");
}
{
System.out.println(sf);
System.out.println("子类初始化块");
}
public Main(){
System.out.println("子类构造器");
System.out.println("i="+i+"j="+j);
}
public static void main(String[] ars){
System.out.println("子类main方法");
new Main();
return;
}
}
class Parent{
public static String ps="父类静态变量";
public String pf="父类变量";
protected int i=0;
protected int j=0;
private int c=initc();
int initc(){
System.out.println("3.父类成员变量赋值:---> c的值"+c);
this.c=12;
System.out.println("3.父类成员变量赋值:---> c的值"+c);
return c;
}
static{
System.out.println(ps);
System.out.println("父类静态初始化块");
}
{
System.out.println(pf);
System.out.println("父类初始化块");
}
public Parent(){
System.out.println("父类构造器");
System.out.println("i="+i+"j="+j);
j=20;
}
}
其运行结果为:
父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块
子类main方法
3.父类成员变量赋值:---> c的值0
3.父类成员变量赋值:---> c的值12
父类变量
父类初始化块
父类构造器
i=0j=0
3.子类成员变量赋值:---> sc的值0
3.子类成员变量赋值:---> sc的值12
子类变量
子类初始化块
子类构造器
i=0j=20
注意在静态变量和静态代码块均初始化完成后才执行子类的main方法
本文深入解析Java中初始化的执行顺序,包括静态代码块、非静态代码块、变量及方法的初始化过程,通过具体实例展示了父类与子类、静态与非静态元素的初始化先后顺序。

被折叠的 条评论
为什么被折叠?



