Java的static修饰变量,方法,代码块的初始化顺序

Java的static修饰变量,方法,代码块的初始化顺序

测试代码

package test;

public class Test {

    static String a = "string-a";
    static String b;
    String c = "stirng-c";
    String d;

    static {
        printStatic("before static");
        b = "string-b";
        printStatic("after static");
    }

    public Test() {
        print("before constructor");
        d = "string-d";
        print("after constructor");
    }

    public static void main(String[] args) {
        new Test();
    }

    public static void printStatic(String title) {
        System.out.println("---------" + title + "---------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
    }

    public void print(String title) {
        System.out.println("---------" + title + "---------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
        System.out.println("c = \"" + c + "\"");
        System.out.println("d = \"" + d + "\"");
    }
}

运行结果

---------before static---------
a = "string-a"
b = "null"
---------after static---------
a = "string-a"
b = "string-b"
---------before constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "null"
---------after constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "string-d"

分析结果

  1. static函数在constructor函数之前。 这是因为static修饰的变量和代码块在JVM加载该类的时候就执行了,而constructor是在实例化的时候才执行。
  2. 修改测试代码,将static修饰的变量放到static修饰代码块之后,发现before static的结果都为null,说明static修饰的代码块和变量初始化顺序是谁写在前面谁先初始化。
  3. 无法分析类的非静态变量和静态变量谁先初始化,需要研究JVM的实现。

总结

Java 类属性和对象属性的初始化顺序
1. static修饰的变量和代码块,两者的先后取决于谁写在前面
2. 对象的非静态变量
3. 构造函数的初始化代码

转载

Erola

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值