一文搞懂Java中类的加载顺序+阿里面试题实战(大白话分析+总结)

执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
1 类加载从上往下执行,依次执行静态的初始化语句和初始化块,且类加载优先于对象创建。(静态初始化语句和静态初始化块只加载一次)
2 创建本类的对象时:从上往下执行一次非静态的初始化语向和初始化块,最后执行构造函数。
3 创建另一个类对象时:先加载另一个类的静态语句和静态初始化块(同样也只是第一次才会加载他的静态语句和初始化块,同样也只加载一次)。然后再加载其他类的非静态的初始化语向和初始化块,最后执行构造函数。
4 静态语句初始化时可以创建类对象。
5 静态方法可以只加载而不调用,不调用不执行。

先上阿里面试题:
在这里插入图片描述
运行结果:
在这里插入图片描述
首先,类加载顺序为从上往下执行,最先执行静态的初始化语句和初始化块(静态语句也是从上往下一行行执行),且所有的静态的初始化语句和初始化块只执行一次(总结中第1条)

下面类开始加载:
先给k赋初始值1,然后创建本类对象t1,由于在创建本类的对象时:从上往下执行一次所有的非静态的初始化语向和初始化块,最后执行该对象对应的构造函数。(总结中第2条)。

所以先执行代码中存在的非静态初始化块,这时候会调用块内的print函数,即输出 1:初始化块 i=0 n=0 (这里i和n都是默认值0是因为还没有对其进行初始化操作) 接着给j赋初始值100,由于最后执行构造函数且当前static语句还没有执行完(即11行代码),所以就该执行第30行代码了,及调用print函数,也就输出 2:j i=1 n=1,由于该11行static语句还没有执行完,所以main方法也不执行。到此第11行代码执行完毕。

接着就该第12行代码,也就是创建本类对象t2,和上面创建本类对象t1的步骤一致,也就把运行结果中的4 到6输出出来了。

接着执行第13行代码,也就会调用print函数,即输出7:i i=6 n=6。

接着执行第14行代码,也就是给n赋初始值99。

接着执行第26行静态块,也就会调用print函数,即输出8:静态块 i=7 n=99(因为此时n已被赋初始值99),然后n被赋值为100。这个静态块也就执行完了。

接着就是执行下一个静态,也就是到第37行main方法了,main方法里又是创建一个本类对象,那步骤就和上面创建t1和t2的一样了。首先执行一遍非静态初始化块,调用print函数,即输出9:初始化块 i=8 n=100,由于方法内执行了++n操作,此时n的值为101了。

接着执行第30行代码,也就是调用print函数,也就输出了 10:j i=9 n=101,++n后,n的值变为102.

最后就只剩下执行构造函数了,也就是输出 11:test i=10 n=102
然后执行++n和++i操作后,i=11,n=103。
到此最后的main方法也已经执行完毕,完结撒花!!!

Java分布式事务是指在分布式系统中,多个独立的服务或应用之间进行数据操作时,保证数据的一致性和可靠性的一种机制。简单来说,就是多个服务或应用在进行数据操作时,要么全部成功,要么全部失败,不会出现部分成功部分失败的情况。 在分布式系统中,每个服务或应用都有自己的数据库,它们之间需要进行数据的读取和写入。当多个服务或应用同时进行数据操作时,可能会出现以下问题: 1. 数据不一致:由于网络延迟或其他原因,某个服务或应用的数据操作成功了,但其他服务或应用的数据操作失败了,导致数据不一致。 2. 并发冲突:多个服务或应用同时对同一份数据进行读写操作,可能会导致数据冲突和错误。 为了解决这些问题,Java分布式事务引入了一些机制和技术,例如: 1. 两阶段提交(Two-Phase Commit):在分布式事务中,引入一个协调者(Coordinator)来协调各个参与者(Participant)的数据操作。在第一阶段,协调者询问各个参与者是否可以提交事务;在第二阶段,如果所有参与者都同意提交,则协调者通知各个参与者提交事务;如果有任何一个参与者不同意提交,则协调者通知各个参与者回滚事务。 2. 分布式事务消息:使用消息队列来实现分布式事务,将数据操作和消息发送放在同一个事务中,保证数据和消息的一致性。 3. 分布式锁:通过分布式锁来控制对共享资源的访问,保证在同一时间只有一个服务或应用可以对资源进行操作,避免并发冲突。 以上是对Java分布式事务的简单介绍,希望能帮到你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值