Java静态变量初始化时机

静态变量初始化方式:

1.声明时初始化;

2.静态块中初始化;

测试:

package com.skymr.learn;
/**
 * 静态变量初始化顺序测试
 * @author skymr
 *
 */
public class InstanceTest2 {

	static int b = 11;
	
	static{
		a = 20;
		b = 22;
	}
	
	static int a = 10;
	
	public static void main(String[] args) throws Exception{
		System.out.println("a="+InstanceTest2.a);
		System.out.println("b="+InstanceTest2.b);
	}
}
结果:

a=10
b=22
测试证明:1,2的先后顺序依靠代码的前后排列


问题:静态变量的初始化是什么时候开始的呢?

package com.skymr.learn;
/**
 * 静态变量初始化顺序测试
 * @author skymr
 *
 */
public class InstanceTest2 {

	static int b = 11;
	
	static{
		System.out.println("静态块");
		a = 20;
		b = 22;
	}
	
	static int a = 10;
	
	public static void nop(){
	}
	
}

Main方法移出来了

package com.skymr.learn;


public class MainTest {
public static void main(String[] args) throws Exception{
System.out.println("main方法开始"); //step1
InstanceTest2.nop();//step2
System.out.println("main方法开始--");//step3
System.out.println("a="+InstanceTest2.a);
System.out.println("b="+InstanceTest2.b);
}
}
打印结果:

main方法开始
静态块
main方法开始--
a=10
b=22

分析:执行step1时InstanceTest2类还没有装载进内存,也就没有运行它的静态块代码;

   当调InstanceTest2.nop方法时,开始将InstanceTest2类载入内存,装载完成后开始自动运行静态变量的声明代码和静态块

          也就是说静态变量是在载入内存后初始化的;
再一示例:

package com.skymr.learn;

public class InstanceTest3 {
	
	
	public static void main(String[] args){
		Person son = new Person(5);
		System.out.println(son.parent.value);
		System.out.println(son.value);
	}
}

class Person{
	final static Person parent = new Person(2); //1
	static int age = 30; //2
	int value;
	public Person(int delta){
		value = age + delta;
	}
}

打印 出:

2
35
分析:new Person时最先执行 1,此时age=0, 所以son.parent.value = 0 + 2 = 2;
     执行完2后,才会进行son的构造方法,所以age = 30;value也就为35了.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值