Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

本文详细阐述了Java类在实例化过程中的初始化顺序,并通过具体示例验证了静态与非静态成员、代码块及构造函数的执行流程。适用于Java初学者及进阶开发者。

结果

在Java类被new的过程中,执行顺序如下:

1.实现自身的静态属性和静态代码块。(根据代码出现的顺序决定谁先执行)
2. 实现自身的非静态属性和非静态代码块。
3.执行自身的构造函数。

实现继承的类被new的过程中,初始化执行顺序如下:

1.实现父类的公共静态属性和静态块级代码。
2. 实现自身的静态属性和静态块级代码。
3.实现父类的非静态属性和非静态代码块。
4.执行父类的构造函数。
5.实现自身的非静态属性和非静态代码块。
6.执行自身的构造函数。
这里需要简单的介绍一下静态代码块和非静态代码块。

//1. 静态代码块:
static {  
}  
//2. 非静态代码块
{  
}  

静态代码块和非静态代码块的异同点如下:

相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。

不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只在第一次new时执行一次,之后不再执行。而非静态代码块每new一次就执行一次。

代码验证

无继承情况:
public class InitOderTest {  
    public static String STATIC_FIELD = "静态属性";  
      
    // 静态块  
    static {  
        System.out.println(STATIC_FIELD);  
        System.out.println("静态代码块");  
    }  
      
    public String field = "非静态属性";  
      
    // 非静态块  
    {  
        System.out.println(field);  
        System.out.println("非静态代码块");  
    }  
  
    public InitOderTest() {  
        System.out.println("无参构造函数");  
    }  
      
    public static void main(String[] args) {  
        InitOderTest test = new InitOderTest();  
    }  
}  

执行结果:

静态属性  
静态代码块  
非静态属性  
非静态代码块  
无参构造函数  

接下来验证当Java类实现继承后,执行顺序是否和我们的结论吻合。测试代码如下:

有继承情况:

父类代码:

class ParentTest {  
    public static String PARENT_STATIC_FIELD = "父类-静态属性";  
  
    // 父类-静态块  
    static {  
        System.out.println(PARENT_STATIC_FIELD);  
        System.out.println("父类-静态代码块");  
    }  
  
    public String parentField = "父类-非静态属性";  
  
    // 父类-非静态块  
    {  
        System.out.println(parentField);  
        System.out.println("父类-非静态代码块");  
    }  
  
    public ParentTest() {  
        System.out.println("父类—无参构造函数");  
    }  
}  

子类代码:

public class InitOderTest extends ParentTest {  
    public static String STATIC_FIELD = "静态属性";  
  
    // 静态块  
    static {  
        System.out.println(STATIC_FIELD);  
        System.out.println("静态代码块");  
    }  
  
    public String field = "非静态属性";  
  
    // 非静态块  
    {  
        System.out.println(field);  
        System.out.println("非静态代码块");  
    }  
  
    public InitOderTest() {  
        System.out.println("无参构造函数");  
    }  
  
    public static void main(String[] args) {  
        InitOderTest test = new InitOderTest();  
    }  
}  

执行结果如下:

父类-静态属性  
父类-静态代码块  
静态属性  
静态代码块  
父类-非静态属性  
父类-非静态代码块  
父类—无参构造函数  
非静态属性  
非静态代码块  
无参构造函数  

通过程序验证,可以看出我们的结论是准确的。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值