java 代码里面static程序段执行顺序

1.问题:

class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Test{ public static void main(String[] ars){ A ab = new B(); //执行到此处,结果: ? System.out.println(""); ab = new B(); //执行到此处,结果: ? } }



2.分析:
上面的代码段结果是什么?先给出答案:第一处输出 1a2b,第二次输出 2b
为什么?
1.static属于类,不属于具体的对象,在java虚拟机JVM在加载类时就会被执行,优先类实例化执行。
2.static的存储区域在全局区域,JVM是为static分配一次内存,所以static块程序只在类第一次加载时运行一次,以后加载都不会再运行。

3.结论
由上分析的两点可以得出上面的程序执行的结果:
A ab = new B();
A和B都是第一次加载,所以先执行静态块即输出1a,紧接着实例化 B ,B是A的子类,先执行父类的构造函数,然后执行子类的构造函数,所以紧接着输出2b。
ab = new B();
由于不是第一次加载,所以只执行构造函数输出2b。

4.举一反三

class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Test{ public static void main(String[] ars){ B b = new B(); //执行到此处,结果: ? } }

变化一下输出结果为什么?
按照上面的1、2、3点分析,应该是能得出答案的,理由我不说了,相信认真思考过都可以得出正确答案(1a2b)。 
经历一些实战后再次更新,更全面的例子:

class A{ static{ System.out.println("static A"); } { System.out.println("normal A"); } public A(){ System.out.println("constructor A"); } } class B extends A{ static{ System.out.println("static B"); } { System.out.println("normal B"); } public B(){ System.out.println("constructor B"); } } public class Test{ public static void main(String[] ars) throws Exception { A a = new B(); a = new B(); } }

如果上面的例子明白输出结果以及原理,那么java中关于块语句执行顺序就应该彻底的清楚了。 : )
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值