类的主动使用

一 点睛

类在主动使用时,初始化方法会被调用。类在被动使用时,初始化方法不会被调用。

Class 只有在必须要首次使用的时候才会被装载,Java 虚拟机不会无条件地装载 Class 类型。Java 虚拟机规定,一个类或接口在初次使用前,必须要进行初始化。这里指的“使用”,是指主动使用,主动使用只有下列几种情况:(即:如果出现如下的情况,则会对类进行初始化操作。而初始化操作之前的加载、验证、准备已经完成。)

二 实例化

当创建一个类的实例时,比如使用 new 关键字,或者通过反射、克隆、反序列化。

三 静态方法

当调用类的静态方法时,即当使用了字节码 invokestatic 指令。

四 静态字段

当使用类、接口的静态字段时(final 修饰特殊考虑),比如,使用 getstatic 或者 putstatic 指令。(对应访问变量、赋值变量操作)

五 反射

当使用 java.lang.reflect 包中的方法反射类的方法时。比如:

Class.forName("com.atguigu.java.Test")

六 继承

当初始化子类时,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

当 Java 虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。

  • 在初始化一个类时,并不会先初始化它所实现的接口

  • 在初始化一个接口时,并不会先初始化它的父接口

  • 因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态字段时,才会导致该接口的初始化。

七 default 方法

如果一个接口定义了 default 方法,那么直接实现或者间接实现该接口的类的初始化,该接口要在其之前被初始化。

八 main 方法

当虚拟机启动时,用户需要指定一个要执行的主类(包含 main()方法的那个类),虚拟机会先初始化这个主类。

VM 启动的时候通过引导类加载器加载一个初始类。这个类在调用 public static void main(String[])方法之前被链接和初始化。这个方法的执行将依次导致所需的类的加载,链接和初始化。

九 MethodHandle

当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在的类。(涉及解析 REF getStatic、REF_putStatic、REF invokeStatic 方法句柄对应的类)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值