李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(八)--类加载器与类初始化深度剖析
Leefs
2019-11-28 AM
7625℃
6条
# 类加载器与类初始化深度剖析 ### 前言 本篇是关于`JVM`学习笔记的一些整理 ### 代码1 ```java class Parent{ static int a = 3; static{ System.out.println("Parent static block"); } } class Child extends Parent{ static int b = 4; static{ System.out.println("Child static block"); } } public class MyTest9 { static{ System.out.println("MyTest9 static block"); } public static void main(String[] args) { System.out.println(Child.b); } } ``` > 类的加载信息 ![类的加载与类的初始化深度剖析01.png][1] ### 总结 从类的加载过程中可以看出,类加载器先加载MyTest9类,所以MyTest9类先被初始化 同时调用子类Child的静态变量b. 在类加载器中先加载父类Parent,在加载子类Child所以先初始化父类Parent,在初始化子类Child。 ### 代码2 ```java class Parent2{ static int a = 3; static{ System.out.println("Parent2 static block"); } } class Child2 extends Parent2{ static int b = 4; static{ System.out.println("Child 2 static block"); } } public class MyTest10 { static{ System.out.println("MyTest10 static bock"); } public static void main(String[] args) { Parent2 parent2; System.out.println("-------------"); parent2 = new Parent2(); System.out.println("------------"); System.out.println(parent2.a); System.out.println("--------------"); System.out.println(Child2.b); } } ``` > 运行结果 ```java MyTest10 static bock ------------- Parent2 static block ------------ 3 -------------- Child 2 static block 4 ``` ### 总结 主函数先进行加载,所以是先对`MyTest10`类的主动使用,导致其先被初始化父类先于子类进行加载当类在首次主动使用时会被初始化,仅仅会被初始化一次 ### 代码3 ```java class Parent3{ static int a = 3; static{ System.out.println("Parent3 static block"); } static void doSomething(){ System.out.println("do something"); } } class Child3 extends Parent3{ static{ System.out.println("Child static block"); } } public class MyTest11 { public static void main(String[] args) { System.out.println(Child3.a); System.out.println("------------------"); Child3.doSomething(); } } ``` > 运行结果 ```java Parent3 static block 3 ------------------ do something ``` ### 总结 **变量或方法定义在谁身上就表示对谁的主动使用,而不看调用方是谁** ### 代码4 ```java class CL{ static { System.out.println("Class CL"); } } public class MyTest12 { public static void main(String[] args) throws ClassNotFoundException { ClassLoader loader = ClassLoader.getSystemClassLoader(); Class> clazz = loader.loadClass("Jvm_Test.CL"); System.out.println(clazz); System.out.println("-----------"); clazz = Class.forName("Jvm_Test.CL"); System.out.println(clazz); } } ``` > 运行结果 ```java class Jvm_Test.CL ----------- Class CL class Jvm_Test.CL ``` ### 总结 调用`ClassLoader`类的`loadClass`方法加载一个类,并不是对类的主动使用,不会导致类的初始化 通过反射方式完成对类的初始化 [1]: https://lilinchao.com/usr/uploads/2019/11/416254268.png
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/232.html
上一篇
持有对象--容器的打印
下一篇
持有对象--List
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Elasticsearch
字符串
数学
设计模式
Hadoop
Ubuntu
SpringCloud
DataX
gorm
SQL练习题
MySQL
Typora
Flume
Thymeleaf
Tomcat
查找
BurpSuite
Yarn
容器深入研究
Java
Kafka
Spark Streaming
排序
Azkaban
Hive
MyBatis-Plus
微服务
序列化和反序列化
Python
并发线程
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭