java static 顺序_java 类中static修饰自身执行顺序,为啥不会出现死循环?

泻药,这个有点意思

首先题主标题说的死循环是肯定不会的,题主担心的死循环无非下面这一句

但是它是static修饰的,这个代码就只会执行一次,所以不会死循环。

静态变量和静态代码块是怎么执行的呢?先给静态变量分配内存空间,然后执行静态变量的初始化和静态代码块中的代码,按照书写的先后顺序

看这个代码,也就是先执行new Main(),然后执行System.out.println(1);,额,居然最下面还有一个static int b= 11;它是在输出1之后执行的(记住,按书写顺序)

普通成员字段和普通代码块呢?创建对象时,先分配内存空间,然后执行变量的赋值和普通代码块中的代码,跟上面一样,按照书写顺序,所以就是先输出2,然后给a赋值为10

最后是构造器,上面的东西都忙完了才执行构造器

所以题主的代码到底是怎么执行的呢

首先加载Main类,有下面的操作

b=0 // 分配空间,int 默认填0

main=null // 分配空间,对象类型填null

main=new Main() // 创建一个Main对象

System.out.println(1) // 输出1

b=11

但是上面的步骤中创建Main对象又有不少事情,也就变成下面这样

b=0 // 分配空间,int 默认填0

main=null // 分配空间,对象类型填null

main=new Main() // 创建一个Main对象

a=0 // 分配空间,int默认填0

System.out.println(2) // 输出2 ##

a=10 // 初始化a

System.out.println(3) // 构造器是创建对象时最后才执行的 ##

System.out.println(String.format("a=%d, b=%d", a, b)); // 输出a=10, b=0 ##

System.out.println(1) // 输出1 ##

b=11 // 初始化b

现在Main类加载完毕,上面的伪代码从上到下依次执行的,带##标志的都会在控制台输出内容,所以到这里,控制台会输出

2

3

a=10, b=0

1

Main加载完之后,执行main方法,它创建了一个Main对象,创建对象的步奏,上面已经列过了,就是有缩进的那5步,我们把它合到一起,也就是得到整个程序的所有步奏如下

注意整个程序创建了两个Main对象,所以有两个a,为了区分,下面使用main.a和m.a,但是b由于是静态变量,所以只有一个。

1.b=0 // 分配空间,int 默认填0

2.main=null // 分配空间,对象类型填null

3.main=new Main() // 创建一个Main对象

4. main.a=0 // 分配空间,int默认填0

5. System.out.println(2) // 输出2 ##

6. main.a=10 // 初始化a

7. System.out.println(3) // 构造器是创建对象时最后才执行的 ##

8. System.out.println(String.format("a=%d, b=%d", main.a, b)); // 输出a=10, b=0 ##

9.System.out.println(1) // 输出1 ##

10.b=11 // 初始化b

11.m=new Main() // 再创建一个Main对象

12. m.a=0 // 分配空间,int默认填0

13. System.out.println(2) // 输出2 ##

14. m.a=10 // 初始化a

15. System.out.println(3) // 构造器是创建对象时最后才执行的 ##

16. System.out.println(String.format("a=%d, b=%d", m.a, b)); // 输出a=10, b=11 ##

所以程序的输出是在第5,7,8,9,13,15,16步进行的,结果如下

2

3

a=10, b=0

1

2

3

a=10, b=11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值