李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习二 -- Java程序对类的使用方式
Leefs
2019-10-16 PM
1475℃
0条
# Java程序对类的使用方式 ### 前言 + #### Java程序对类的使用方式可分为两种 + 1.主动使用 + 2.被动使用 + #### 所有的Java虚拟机实现必须在每个类或接口被Java程序"**首次主动使用**"时才初始化他们 ### 一、主动使用(七种) 1. **1.创建类的实例**(new出来一个class对象) 2. **2.访问某个类或接口的静态变量,或者对该静态变量赋值**(对静态变量赋值和对静态变量取值) 3. **3.调用类的静态方法** 4. **4.反射(如Class.forName("com.test.Test"))** 5. **5.初始化一个类的子类** ```java class Parent{ } class Child extends Parent{ } ``` 当初始化child子类的时候,也是对Parent父类的主动使用 6. **6.Java虚拟机启动时被标明为启动类的类(Java Test)**(包含main方法的类) 7. **7.JDK1.7开始提供的动态语言支持:** java.lang.invoke.MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有初始化,则初始化 第2和第3在字节码文件中是相似的。 ### 二、被动使用 除了以上七种情况,其他使用Java类的方式都被看作是对类的**被动使用**,都不会导致类的**初始化**(可能加载该类进行连接不进行初始化,也可能不加载该类) ### 三、代码分析 ### 例1: ```java public class MyTest01 { public static void main(String[] args) { System.out.println(MyChild1.str); } } class MyParent1{ public static String str = "hello world"; static{ System.out.println("MyParent1 static block"); } } class MyChild1 extends MyParent1{ static { System.out.println("MyChild1 static block"); } } ``` 运行结果: ```java MyParent1 static block hello world ``` > 代码分析: 一个类在初始化的时候执行该类的静态代码快。 程序通过main方法在调用子类**MyChild1**时会首先会对父类**MyParent1**进行初始化,即对父类的主动使用,输出**MyParent1 static block**,然后调用父类的str静态变量,输出**hello world.** 整个过程中并未执行子类MyChild1的静态方法,说明子类并未被初始化,即没有对子类的主动使用。 ### 例2: ```java public class MyTest01 { public static void main(String[] args) { System.out.println(MyChild1.str2); } } class MyParent1{ public static String str = "hello world"; static{ System.out.println("MyParent1 static block"); } } class MyChild1 extends MyParent1{ public static String str2 = "welocm"; static { System.out.println("MyChild1 static block"); } } ``` 执行结果: ```java MyParent1 static block MyChild1 static block welocm ``` 在例1 中添加str2,主函数调用str2变量. 先执行父类代码块,在执行子类代码块,执行子类的str2. ### 总结 对于静态字段来说,只有直接定义了该字段的类才会被初始化; 当一个类在初始化时,要求其父类全部都已经初始化完毕了。 [1]: https://avatars2.githubusercontent.com/u/40163010?s=460&v=4
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/29.html
上一篇
JVM学习一 -- 浅谈类的加载过程
下一篇
抽象类和抽象方法练习
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Typora
FastDFS
GET和POST
Flink
Azkaban
Kafka
高并发
JavaWeb
FileBeat
Nacos
VUE
DataWarehouse
并发线程
Yarn
JVM
MyBatis
持有对象
Spark Core
国产数据库改造
Jenkins
查找
SpringBoot
排序
nginx
MyBatis-Plus
锁
Spark
Quartz
字符串
队列
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞