JVM 原理四:接口初始化规则与类加载器准备阶段和初始化阶段的重要意义

本文详细分析了Java中接口的初始化过程,指出只有在使用接口中的常量时才会触发接口初始化,而类的初始化则不同。并通过实例演示了类加载器与单例模式的关系,强调了理解和掌握这些技术点对面试的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

>>号外:关注“Java精选”公众号,回复“2021面试题”关键词,领取全套500多份Java面试题文件。

连接:先看一段代码:

public class MyTest5 {

public static void main(String[] args) {

System.out.println(MyChild5.b);

}

}

interface MyParent5{

public static final int a = 5;

}

interface MyChild5 extends MyParent5{

public static final int b = 6;

}

这段代码相信运行结果大家都能一目了然,那么父接口MyParent5和MyChild5 是否会初始化呢?由于在接口当中不能定义静态代码块, 因此我们把MyParent5的class文件删除再去运行:

由此得出当一个接口初始化时并不要求其父接口完成了初始化

我们在进一步,这时删除MyChild5 再去运行:

再接着我们这样写代码,然后删除父接口:

由此就可以得出,子接口的常量只有在运行期间才能确定的,并不会放到调用类的常量池当中,这时会触发父接口的初始化。

我们再次反过来实验:

这次我们删除了子接口,但是父接口的常量只有在运行期间才会确认,这个时候会触发子类的初始化。

还有下边这种情况:

总结:

**当一个接口初始化时并不要求其父接口完成了初始化

只有在真正用到父接口的时候(如引用接口中定义的常量时),才会初始化。** 而类不是这样的,原因就是借口中的变量本来就是final的。

接着我们把MyChild5改为Class的形式,然后删除MyParent5:

发现MyParent5找不到,因此补充结论:

只有使用类的常量的时候不会去加载接口,一般的静态变量,非常量都会加载接口。因为非常量都不会纳入到MyTest5的常量池当中,因此导致接口的初始化。

类加载器准备阶段很初始化阶段的重要意义:

我们写一个单例模式:

public class MyTest6 {

public static void main(String[] args) {

Singleton singleton = Singleton.getInstance();

System.out.println(Singleton.counter1);

System.out.println(Singleton.counter2);

}

}

class Singleton{

public static int counter1;

public static int counter2=0;

private static Singleton singleton = new Singleton();

private Singleton(){

counter1++;

counter2++;

}

public static Singleton getInstance(){

return singleton;

}

}

程序运行结果:

1

1

毫无悬念肯定是1 1 。

接下来我们改一下程序:

public class MyTest6 {

public static void main(String[] args) {

Singleton singleton = Singleton.getInstance();

System.out.println(Singleton.counter1);

System.out.println(Singleton.counter2);

}

}

class Singleton{

public static int counter1;

private static Singleton singleton = new Singleton();

private Singleton(){

counter1++;

counter2++;

}

public static int counter2=0;

public static Singleton getInstance(){

return singleton;

}

}

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

大厂面试真题:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

}

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

[外链图片转存中…(img-tghpxEq9-1714506450222)]

大厂面试真题:

[外链图片转存中…(img-9j4KKF7k-1714506450222)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值