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

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. Python——最美丽的编程语言

    之前总听别人说Python有多厉害,有多好,我是不以为然的.但是当我开始接触Python的时候,我就知道它被誉为最美编程语言不是没有道理的.简短的代码,清晰明了的逻辑,方便快捷的编程工具让它注定会大放 ...

  2. 解决hql无法使用mysql方法的问题——以date_add()为例

    一.前言 最近在做一个定时任务,具体为定时清理掉mysql中存储的,一个月前的数据.而在hql语句中,就需要调用mysql的date_add()方法. 但是在hibernate中,是不允许使用各个SQ ...

  3. 精品自用IDEA插件吐血推荐

    Alibaba Java Coding Guidelines 该插件集成了Alibaba代码编程规范,可以帮你找出你的代码怪味道 .gitignore 当你使用Git作为版本工具的时候,想要快速的添加 ...

  4. 003 Python基本语法元素

    目录 一.概要 1.1 方法论 1.2 实践能力 一.概要 程序设计基本方法:https://www.cnblogs.com/nickchen121/p/11164043.html Python开发环 ...

  5. Spring boot出现Cannot determine embedded database driver class for database type NONE

    在spring boot项目中,我们在pom.xml文件中添加了mysql和mybatis的依赖,我们常常遇到下面这样的问题: Description: Cannot determine embedd ...

  6. springcloud(六):Spring Cloud 配置中心采用数据库存储配置内容

    Spring Cloud 配置中心采用数据库存储配置内容 转自:Spring Cloud Config采用数据库存储配置内容[Edgware+] Spring Cloud Server配置中心采用了G ...

  7. Python3实战Spark大数据分析及调度 (网盘分享)

    Python3实战Spark大数据分析及调度 搜索QQ号直接加群获取其它学习资料:715301384 部分课程截图: 链接:https://pan.baidu.com/s/12VDmdhN4hr7yp ...

  8. java.lang.UnsupportedClassVersionError:JDK版本不一致报错

    交代一下背景:公司运行的一个上线项目,打了个补丁发给客户后,反馈说运行不了.把源码拿回来场景重现.贴上报错信息: 08-15 14:13:29 ERROR doPost(jcm.framework.r ...

  9. java中的equals方法与"=="运算符解说

    在编程的时候,我们可能经常会用到equals方法,那么这个equals方法和运算符“==”有什么样的区别? public class equal { /** * @param args */ publ ...

  10. TestNG(五) 5-7 套件测试

    <?xml version="1.0" encoding="utf-8" ?> <suite name="test"> ...