Java对类的使用方式

Time:2021-03-05 Author:admin

​    Java对类的使用方式分为主动使用和被动使用。主动使用会触发类的初始化,被动使用不会(但是还是会触发初始化之前的操作)。

Java对类的使用方式

   主动使用的场景

 

   1、创建某个类的对象

 

   2、调用某个类的类属性、类方法

 

   3、获取某个类的反射对象

 

   4、初始化子类,如果父类没有初始化,会先触发父类的初始化(不适用接口)

 

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

 

   6、虚拟机启动,调用主方法的类会被初始化

 

   7、初次调用MethodHanlder实例时,初始化该MethodHanlder指向的方法所在的类。(涉及解析REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄所在的类)

Java对类的使用方式

   被动使用的场景

 

   1、访问的类属性不是当前类的属性,比如从父类继承而来的或者实现接口得到的,比如

public class InitTest{

   public static void main(String[] args) {

       int a = son.a;

   }

}class parent{

   public static int a =0;

   static {

       System.out.println("12");

   }

}class son extends parent{

   public static int b =0;

   static {

       System.out.println("1ss2");

   }

}

 

   这里只会触发parent的初始化,而不会触发son类的初始化,而如果son重写了属性a或者调用的是son的另一个属性b,那么就会触发son类的初始化,并且因为son继承了parent类,所以在son初始化前还会先初始化parent。

 

   2、通过数组定义类引用,不会触发此类的初始化(如果数组类型是基本数据类型,那么不需要加载;如果是引用数据类型,那么就进行类的加载,但不会进行初始化操作)

 

   3、调用staticfinal修饰的且是常量或者是字符串或是其他没有方法触发的情况,也不会触发初始化操作。

 

   4、调用ClassLoader的loadClass()方法加载一个类,只会触发加载操作,而不会触发初始化操作。