李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(七)-- 初始化对于类与接口的异同深入解析
Leefs
2019-11-17 PM
4113℃
2条
# 初始化对于类与接口的异同深入解析 ### 前言 **类的初始化时机** 当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则不适用与接口。 + 1.在初始化一个类时,并不会先初始化它所实现的接口。 + 2.在初始化一个接口时,并不会先初始化它的父接口。 因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。 接下来的文章中将举例说明。 ### 示例1 ```java public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b); } } interface MyParent5{ public static int a = 6; } interface MyChild5 extends MyParent5{ public static int b =5; } ``` > 输出结果 ```java 5 ``` 为了更好的对结论进行论证,我们需要在IDEA中开启一个虚拟机参数,用来追踪类的加载信息,并打印在控制台中。 **虚拟机参数:** `-XX:+TraceClassLoading:`用于追踪类的加载信息并打印出来 IDEA工具: ![JVMTest001.png][1] 在`VM options`中添加代码:`-XX:+TraceClassLoading` ![MyTest5.1.png][2] 我们在去重启一下代码: 查看控制台打击结果 ![Mytest5.2.png][3] 从打印结果可以看出,因为`MyTest5`类中有主函数,在进行运行时是对`MyTest5`的主动使用,所以在类的加载信息中第一个红色框中就是对`MyTest5`的加载,但是在加载信息中并没有`MyParent5`和`MyChild5`的加载信息。 这个时候我们可不可以进行这样的推测:在运行`MyTest5`类中的主函数时并没有去加载`MyParent5`和`MyChild5`类,也就是说没有这两个类的class文件程序会照常执行。 下面我们做一个大胆的验证,将MyParen5和MyChild5生成的类文件都删除掉 ![Mytest5.3.png][4] 将上图中的`MyParent5.class`和`MyChild5.class`文件删除,在运行程序。 此时,我们会发现两次程序的执行结果没有差别,于是我们就可以得出以下结论: > 接口和类的加载过程是不同的 > > 如果将接口换成类,会导致MyChild5类的主动使用,MyChild5一定会被加载出来 > > 如果是接口,MyChild5并没有被加载 ### 示例2 ```java public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b); } } interface MyParent5{ public static int a = 6; } interface MyChild5 extends MyParent5{ //public static int b =5; public static int b = new Random().nextInt(3); } ``` > 类的加载信息 ![Mytest5.4.png][5] **示例2**是将**示例1**中的b由5变成了一个随机值。 通过类的加载信息我们可以清晰的看到不光主函数加载到了,而且MyParent5和MyChild5也被加载到了。 **为什么会出现这种情况呢?** 小编整理了三四个示例对结论进行论证,保存过文件在进去后就剩下这么点内容了。。。。。。以后有时间在重新补吧 [1]: https://lilinchao.com/usr/uploads/2019/11/7761793.png [2]: https://lilinchao.com/usr/uploads/2019/11/3427849021.png [3]: https://lilinchao.com/usr/uploads/2019/11/638249450.png [4]: https://lilinchao.com/usr/uploads/2019/11/303843048.png [5]: https://lilinchao.com/usr/uploads/2019/11/1409161533.png
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/200.html
上一篇
JVM学习(六)--类加载器深入解析及重要特性剖析
下一篇
Java中静态和非静态的区别
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Linux
Sentinel
Ubuntu
Spark SQL
SQL练习题
国产数据库改造
Spark
Nacos
序列化和反序列化
JavaScript
Stream流
Spark Streaming
微服务
Golang基础
Hbase
JavaWeb
散列
Kafka
Jenkins
数据结构
Hive
稀疏数组
二叉树
Spark Core
Filter
Map
Spring
Elasticsearch
JVM
MyBatisX
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭