静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行。 执行顺序优先级:静态块,main(),构造块,构造方法。
public class LoadBlock {
public LoadBlock() {
System.out.println("构造函数");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
LoadBlock A = new LoadBlock();
LoadBlock B = new LoadBlock();
}
}
/********* 运行结果 **********/
静态代码块
构造代码块
构造函数
构造代码块
构造函数
静态代码块只运行一次,构造代码块优先于构造函数
public class InitialClass {
// 静态变量
public static String staticField = "staticField";
// 普通变量
public String field = "field";
static {
System.out.println(staticField);
System.out.println("static block init");
}
{
System.out.println(field);
System.out.println("block init");
}
public InitialClass() {
System.out.println("Constructor init");
}
public static void main(String[] args) {
new InitialClass();
}
}
/******** 执行结果 *************/
staticField
static block init
field
block init
Constructor init
(静态变量、静态初始化块)>(变量、初始化块)>构造器。
class HelloA {
public HelloA() {
System.out.println("A's constructor");
}
{
System.out.println("A's code block");
}
static {
System.out.println("A's static code block");
}
}
public class InheritLoad extends HelloA{
public InheritLoad() {
System.out.println("son constructor");
}
{
System.out.println("son's code block");
}
static {
System.out.println("son's static code block");
}
public static void main(String[] args) {
InheritLoad obj = new InheritLoad();
}
}
/********** 运行结果 ************/
A's static code block
son's static code block
A's code block
A's constructor
son's code block
son constructor
有继承的情况,执行顺序如下:
java类初始化执行顺序如下:
规律是 静态变量、静态代码块->普通变量、初始化块、构造器
因为静态代码块是跟类关联的,所以只执行一次,并且优先级最高