深度剖析类加载器系列文章:二、类的主动使用和被动使用

来源:互联网 发布:mac pro 如何重装系统 编辑:程序博客网 时间:2024/05/17 02:10

深度剖析类加载器系类文章:二、类的主动使用和被动使用

本文为本人理解总结,如有错误请指正

1.Java类的使用方式

  • Java程序对类的使用方式可以分为两种:
    1. 主动使用:会执行加载、连接、初始化
    2. 被动使用:只执行加载、连接,不执行类的初始化。
  • 所有的Java虚拟机实现必须在类或接口被Java程序“首次主动使用”时才初始化它们(JVM规范)。

2.主动使用(六种)

  • 创建类的实例
  • 访问某个类或接口的静态变量,或对该静态变量赋值(即在字节码中,执行getstatic或putstatic指令时)
  • 调用类的静态方法(即在字节码中执行invokestatic指令时)
  • 反射
  • 初始化一个类的子类
  • 当虚拟机启动某个被表明为启动类的类
    Java类的初始化规则:

    1. 类按静态变量、静态代码块的定义顺序初始化
    2. 先初始化父类
    3. 当访问一个Java类或接口中的静态域的时候,只有真正声明这个域的类或接口才会被初始化。
    4. 接口初始化不会导致父接口的初始化。

      例子:

      package com.wzm.jvm;    /**     * @ClassName: Test7     * @Description:      * @author nameisbill     * @date 2017年1月18日 下午4:08:09     */public class Test7 {    static{        System.out.println("Class Test7 is initialized");    }    public static void main(String[] args) {        int age=Child.age;    }}class Parent {    public static int age=36;    static{        System.out.println("Class Parent is initialized");    }}class Child extends Parent{    public static int number=3;    static{        System.out.println("Class Child is initialized");    }   }

      控制台输出结果是:
      Class Test7 is initialized
      Class Parent is initialized

      在上述代码中通过Child.age引用了其父类Parent中声明的静态变量age,根据上面的初始化规则第三条,由于age是在父类Parent中声明定义的,所以只加载初始化父类Parent,不初始化Child。

3.被动使用

除了上面六种方式,其他的都是类的被动使用。

0 0