字节码指令和符号引用、直接引用

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(三)初始化的更多相关文章

  1. JVM(三):深入分析Java字节码-上

    JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...

  2. jvm三的三种类加载器

    JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类.他们主要是分工不一样,各自负责不同的区域,另外也是为了实 ...

  3. JVM——三个ClassLoader详解

    类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件.JVM在运行时会产生三个ClassLoader: ...

  4. JVM学习笔记之初识JVM(三)

    一.JVM在计算机中的位置 JVM调用操作系统,操作系统调用硬件,硬件反馈信息至操作系统,操作系统反馈信息至JVM 二.JVM的体系结构 JVM在执行过程中对内存的管理分为5个区域: 1.PC寄存器 ...

  5. JVM(三)-java虚拟机类加载机制

    概述: 上一篇文章,介绍了java虚拟机的运行时区域,Java虚拟机根据不同的分工,把内存划分为各个不同的区域.在java程序中,最小的运行单元一般都是创建一个对象,然后调用对象的某个 方法.通过上一 ...

  6. Java编程思想学习(三) 初始化与清理

    1. 每个重载的方法都必须有独一无二的参数类型列表.(参数顺序的不同也足以区分两个方法,但不建议这样做,会使代码难以维护.) 2. 方法重载时,如果可以重载的方法间只是参数类型不同,传入的数据类型(实 ...

  7. 一步步优化JVM三:GC优化基础

    本节主要描述关于垃圾回收器性能的三个指标,三个关于垃圾回收器优化的基本原则,以及优化HotSpot VM的垃圾回收器的信息收集,在这些指标中权衡以及信息的收集是非常重要的. 性能指标    吞吐量:衡 ...

  8. JVM三种垃圾收集算法思想及发展过程

    JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sw ...

  9. 深入理解JVM(三)——垃圾收集策略具体解释

    Java虚拟机的内存模型分为五个部分.各自是:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 这五个区域既然是存储空间,那么为了避免Java虚拟机在执行期间内存存满的情况,就必须得有一个垃圾收 ...

  10. JVM(三) 垃圾回收时间点和垃圾收集器

      收集器组合章节来自第一篇参考文章,非原创,作者总结地非常好!          分代收集相关概念来自参考文章第二篇,非原创         第二篇参考资料的文章质量很高,推荐阅读! 分代收集(Ge ...

随机推荐

  1. Codeforces 832 D Misha, Grisha and Underground

    Misha, Grisha and Underground 题意:Misha 和 Grisha 是2个很喜欢恶作剧的孩子, 每天早上 Misha 会从地铁站 s 通过最短的路到达地铁站 f, 并且在每 ...

  2. 牛客小白赛5 无关(relationship) 容斥原理(计算因子数的模板)

    链接:https://www.nowcoder.com/acm/contest/135/A来源:牛客网 若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关.   给出一个含有k个元素的集 ...

  3. codeforces 805 D. Minimum number of steps(数学)

    题目链接:http://codeforces.com/contest/805/problem/D 题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次. 题解:这题可以多列几组来找规律, ...

  4. 题解 bzoj 2151 种树

    题意 传送门 手写堆大法好啊,题解貌似没有结构体堆的做法,思路有些像配对堆,关于配对堆请自行百度,因为本蒟蒻不会.. 以下是蒟蒻的做法:建立一个大根堆a维护最大价值里面存入它的编号以及价值.听说配对堆 ...

  5. 实现 Java 本地缓存,该从这几点开始

    缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache.对于这些工具,我想大家肯定都非常熟悉,所以今天 ...

  6. LVM(逻辑卷管理)

    一.LVM概念 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管 ...

  7. apache ignite系列(九):使用ddl和dml脚本初始化ignite并使用mybatis查询缓存

    博客又断了一段时间,本篇将记录一下基于ignite对jdbc支持的特性在实际使用过程中的使用. 使用ddl和dml脚本初始化ignite 由于spring-boot中支持通过spring.dataso ...

  8. 基于python的selenium两种文件上传操作

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法. 方法二.非input标签上传 这种上传方 ...

  9. CSS精灵图合成工具

    链接:http://pan.baidu.com/s/1o7OUUVo 提取密码:rmnx

  10. Windows导出文件夹中的文件名列表

    在需要导出的目录中,shift+右键,打开cmd或者powershell 运行命令:dir -name >list.txt 刷新文件夹,打开list.txt