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

来源:互联网 发布:网络直播第一人 编辑:程序博客网 时间:2024/05/17 08:29
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中关于块语句执行顺序就应该彻底的清楚了。 : )
0 0
原创粉丝点击