李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习二 -- Java程序对类的使用方式
Leefs
2019-10-16 PM
1467℃
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://lilinchao.com/archives/29.html
上一篇
JVM学习一 -- 浅谈类的加载过程
下一篇
抽象类和抽象方法练习
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Quartz
Shiro
Ubuntu
Netty
数据结构和算法
递归
Python
LeetCode刷题
JavaWEB项目搭建
Spark RDD
稀疏数组
Map
Spark SQL
哈希表
链表
MyBatis-Plus
Golang基础
DataX
Stream流
国产数据库改造
序列化和反序列化
Spring
NIO
nginx
Yarn
Tomcat
算法
Docker
Spark Streaming
工具
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞