赞
踩
首先看下这段代码:
public class Test2 { static Test2 test1 = new Test2(); static int a =10; static { System.out.println(a); System.out.println("bb"); a=11; } public Test2() { System.out.println("cc"); } { System.out.println("aa"); System.out.println(a); } public static void main(String[] args) { Test2 test = new Test2(); }输出的结果为:
为什么会有这种结果呢?
对此我的理解是:
第一步:首先会将所有static定义的成员变量先声明出来,但是不赋初值,并给与默认值,例如(boolean是false,int为0)
第二步:在类加载的时候,按照从上到下执行static修饰的代码,此时执行static Test2 test1 = new Test2(),也就是创建出一个名为test1的对象
第三步:首先进行构造方法的执行前,会执行实例初始化块中的代码,此时输出aa以及a的值(由于第一步没赋初值,并且给了默认值为0 所以输出0)
第四步: 执行构造方法,所以输出cc
第五步:顺序执行static修饰的代码:static int a =10; //给a变量赋值为10
第六步:顺序执行static修饰的代码,也就是static修饰的代码块 //首先输出a的值为10 然后输出bb,最后将a的值定义为11
第六步:此时除了main方法,所有由static修饰的代码全部执行完毕(static修饰的代码只执行一次),类初始化完成,开始执行main方法,main方法中只有一条语句(Test2 test = new Test2()),也就是创建一个test2的对象
第七步:进行构造方法的执行前,会执行实例初始化块中的代码,此时输出aa以及a的值(11)
第八步: 执行构造方法,所以输出cc
此时所有代码执行完毕
好了现在锻炼一个简单的问题吧!
以下代码输出什么呢?
- public class Test2 {
- static int a =10;
-
- static {
- System.out.println(a);
- System.out.println("bb");
- a=11;
- }
-
- public Test2() {
- System.out.println("cc");
- }
-
- {
- System.out.println("aa");
- System.out.println(a);
- }
-
- public static void main(String[] args) {
- Test2 test = new Test2();
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
评论区打出答案吧!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。