什么时候发生类的初始化呢?
当类主动引用的时候,一定会发生类的初始化
当虚拟机启动,先初始化main方法所在的类
new一个类的对象
调用类的静态成员(除了final常量)和静态方法
使用java.lang.reflect包的方法对类进行反射调用
初始化一个类,如果父类没有初始化,会先初始化它的父类
类的被动引用,不会发生类的初始化
当访问一个静态域时,只有真正声明这个域的类才会被初始化,比如:当通过子类引用父类的静态变量时候,不会导致子类初始化
通过数据定义类的引用,不会触发类的初始化
引用常量不会触发类的初始化(常量在链接阶段就存入调用类的常量池了)
package com.company;
//测试类什么时候会初始化
public class test05 {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
//主动引用
Son son = new Son();
//反射也会产生主动引用
Class.forName("com.company.Son");
//不会产生类的引用的方法
//子类调用父类的静态方法
System.out.println(Son.b);
//通过数组也不会被加载,子类和父类都不会被加载
Son[] array = new Son[6];
//调用常量池的常量
System.out.println(Son.M);
}
}
class Father {
static int b = 2;
static {
System.out.println("父类被加载");
}
}
class Son extends Father {
static {
System.out.println("子类被加载");
m = 300;
}
static int m = 100;
//静态常量
static final int M = 1;
}
通过测试来说明,
发生类的初始化的两种情况
第一种:当new一个对象的时候,会发生类的初始化
这个也侧面说明,如果父类没有初始化,会先初始化父类
第二种:当利用反射加载一个类时,会发生类的初始化
不会发生类的初始化的情况:
第一种:访问一个静态方法
第二种:定义一个数组
第三种:引用常量
好了,大家可以按照我的代码试一下,代码是特别基础的那种,主要是为了熟悉什么时候发生类的初始化~
这个也时看的狂神的视频,大家也可以去看~