类的静态变量初始化

类的静态变量初始化

例:

public class Test {
    private static int a = 0;
    private static Test t = new Test();
    private static int b = 0;

    private Test() {
        a++;
        b++;
        System.out.println("构造方法内:a="+a);
        System.out.println("构造方法内:b="+b);
    }
    public static void main(String[] args) {
        System.out.println("main:a="+Test.a);
        System.out.println("main:b="+Test.b);
    }
}

先猜猜运行结果 ? (1,1,1,1)

//正确的运行结果
构造方法内:a=1
构造方法内:b=1
main:a=1
main:b=0

分析

类加载过程: 加载->连接->初始化->使用->卸载;

重点说下连接初始化两个阶段:

连接阶段分为:

​ 验证: 校验字节码,确保被加载的类的正确性和安全性。

准备: 为类变量分配内存,设置默认值,但是在到达初始化之前,类变量都没有初始化为正确的初始值.

​ 解析:在常量池中寻找类、接口、字段和方法的符号引用,并替换为直接引用的过程.

初始化:为类变量赋予正确的初始值。

类的静态变量的初始化顺序:从上至下

//1 执行main方法,
    public static void main(String[] args) {
        System.out.println("main:a="+Test.a);
        System.out.println("main:b="+Test.b);
    }
//2 加载 Test类
//2.1 忽略其他步骤,直接看 '连接' 的 '准备'阶段
	private static int a = 0; //设置 为0,
    private static Test t = new Test(); //设置 为null
    private static int b = 0; //设置 为0 (*)
//2.2 初始化 阶段
	private static int a = 0;//赋值 为0 
    private static Test t = new Test();//执行 new Test(); 
	//调用构造方法 执行如下:
 	private Test() {
        a++;//在赋值为0后,加1,为1
        b++;//在(*)这步后,加1,为1
        //所以接下来输出为 1,1
        System.out.println("构造方法内:a="+a);
        System.out.println("构造方法内:b="+b);
    }
	
    private static int b = 0;//赋值 b=0;(b->1->0)
//3 回到main方法 
//输出 1,0

   

结尾

有不对之处,欢迎指正.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值