JVM(三)初始化
字节码指令和符号引用、直接引用
1.主动引用和被动引用
主动引用:虚拟机规定只有满足四个情况的的情况下,才会进行主动引用。
被动引用:除过四种情况的引用是被动引用。
只有主动引用才会初始化
2.通过子类调用父类的静态字段,是被动引用,不会让初始化子类,只会初始化父类。
对于静态字段,只有直接定义这个字段的类会才会被初始化,因此,通过子类调用父类的静态字段,只会让父类初始化,子类不会初始化
class Father {
public static int age = 54;
static {
System.out.println("父类被初始化");
}
}
class Child extends Father{
static {
System.out.println("子类被初始化");
}
}
class Test{
public static void main(String args[]){
syso(Child.g=age);
}
}
输出:父类被初始化 33
3.常量在编译阶段会存入调用它的类的常量池中,本质上没有直接引用到定义该常量的类上,因此不会触发定义该常量的类。
对于final对象,考虑编译阶段是否是符号引用还是直接引用
class Const{
public static final int String name = "常量";
static{
syso("初始化Const类");
}
}
class test{
public static void main(String args[]){
syso(Const.name);
}
}
输出:常量
虽然在程序中引用了Const类的常量,但是在编译阶段将此常量的值“常量”存储到了test类的常量池中,对Const常量的引用实际转化成了对自身常量池的引用。两个类在编译之后就不会存在联系了。
4.通过数组定义来引用类,不会触发类的初始化
class Const{
public static final int String name = "常量";
static{
syso("初始化Const类");
}
}
class test{
public static void main(String args[]){
Const sonst[] = new Const[5];
}
}
输出 不输出任何内容
在这段代码里面触发了另一个名为“LLConst”的类的初始化,他是一个由虚拟机自动生成、直接继承与java.lang.Object的子类,创建动作有字节码指令newarray触发,很明显,这是由一个对数组引用
类型的初始化,而该数组只包含了一个队Const的引用,并没有对其进行初始化,如果加入实例化数组里面的Const对象,就会触发
class test{
public static void main(String args[]){
Const sonst[] = new Const[5];
for(Const s: sonst){
s = new Const();
}
}
输出:Const被初始化
5.接口和类在初始化的不同:
接口也有初始化的过程,上面的代码中都是用静态语句块的输出初始化信息的,在接口中不能使用“static{}”语句块,但编译器仍然会为接口生成<clinet>类构造器用于初始化接口定义的成员变量;
当一个类在初始化时,要求其父类全部已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部完成了初始化,只有真正使用父接口的时候(如引用接口定义的常量),才会初始化该父类接口。
JVM(三)初始化的更多相关文章
- JVM(三):深入分析Java字节码-上
JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
- jvm三的三种类加载器
JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类.他们主要是分工不一样,各自负责不同的区域,另外也是为了实 ...
- JVM——三个ClassLoader详解
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件.JVM在运行时会产生三个ClassLoader: ...
- JVM学习笔记之初识JVM(三)
一.JVM在计算机中的位置 JVM调用操作系统,操作系统调用硬件,硬件反馈信息至操作系统,操作系统反馈信息至JVM 二.JVM的体系结构 JVM在执行过程中对内存的管理分为5个区域: 1.PC寄存器 ...
- JVM(三)-java虚拟机类加载机制
概述: 上一篇文章,介绍了java虚拟机的运行时区域,Java虚拟机根据不同的分工,把内存划分为各个不同的区域.在java程序中,最小的运行单元一般都是创建一个对象,然后调用对象的某个 方法.通过上一 ...
- Java编程思想学习(三) 初始化与清理
1. 每个重载的方法都必须有独一无二的参数类型列表.(参数顺序的不同也足以区分两个方法,但不建议这样做,会使代码难以维护.) 2. 方法重载时,如果可以重载的方法间只是参数类型不同,传入的数据类型(实 ...
- 一步步优化JVM三:GC优化基础
本节主要描述关于垃圾回收器性能的三个指标,三个关于垃圾回收器优化的基本原则,以及优化HotSpot VM的垃圾回收器的信息收集,在这些指标中权衡以及信息的收集是非常重要的. 性能指标 吞吐量:衡 ...
- JVM三种垃圾收集算法思想及发展过程
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sw ...
- 深入理解JVM(三)——垃圾收集策略具体解释
Java虚拟机的内存模型分为五个部分.各自是:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 这五个区域既然是存储空间,那么为了避免Java虚拟机在执行期间内存存满的情况,就必须得有一个垃圾收 ...
- JVM(三) 垃圾回收时间点和垃圾收集器
收集器组合章节来自第一篇参考文章,非原创,作者总结地非常好! 分代收集相关概念来自参考文章第二篇,非原创 第二篇参考资料的文章质量很高,推荐阅读! 分代收集(Ge ...
随机推荐
- hdu 5887 Herbs Gathering (dfs+剪枝 or 超大01背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5887 题解:这题一看像是背包但是显然背包容量太大了所以可以考虑用dfs+剪枝,贪心得到的不 ...
- atcoder D - Game on Tree(树形dp+尼姆博弈)
题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_d 题解:简单的树上的尼姆博弈,这个应该看的出来然后就是简单的树形dp然后异或一下就行. #inc ...
- 牛客OI测试赛 F 子序列 组合数学 欧拉降幂公式模板
链接:https://www.nowcoder.com/acm/contest/181/F来源:牛客网 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘 ...
- 数论 线性同余方程的应用 poj2891
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 17321 ...
- DevExpress的GridView,为每行的动态绑定不同的RepositoryItemLookUpEdit
有时需要动态为RepositoryItemLookUpEdit绑定数据源,比如联动选择的场景或者我们仅仅是需要一个下拉选择框而并不想要GridView的列与RepositoryItemLookUpEd ...
- CentSO7.6下部署Maridb Galera Cluster 实践记录(一)
根据目前系统业务发展,预计未来上集成的概率异常之高,所以提前学习如何部署,网上尽管有很多这方面资料,但是真正适合自己的只有实践过的. 很奇怪目前的yum资源库里面为什么没有galera资源,目前只能通 ...
- 【LeetCode】79-单词搜索
题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中 "相邻" 单元格是那些水平相邻或垂直相邻的单元格.同一 ...
- Java SSM三端分离开发在线教育平台实战视频教程
目录: 1-01——在线网校实战课程介绍1-02——Eclipse.Maven.JDK介绍1-03——Maven构建Project1-04——新浪SAE介绍2-01——平台业务结构概览2-02——平台 ...
- 从零开始构建Linux
目的:深入了解以Linux内核为基础的系统是如何组成,运行,以构建一个最基础的,纯净的系统. LFS构建步骤宿主机准备- linux操作系统安装- 使用独立硬盘,创建分区- 配置用户和组- 下载所有需 ...
- 基于STC89C52的oled红外遥控闹钟
这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉 ...