java反射之类的初始化

什么时候发生类的初始化呢?

当类主动引用的时候,一定会发生类的初始化
当虚拟机启动,先初始化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一个对象的时候,会发生类的初始化
在这里插入图片描述
这个也侧面说明,如果父类没有初始化,会先初始化父类

第二种:当利用反射加载一个类时,会发生类的初始化
在这里插入图片描述

不会发生类的初始化的情况:

第一种:访问一个静态方法
在这里插入图片描述
第二种:定义一个数组
在这里插入图片描述
第三种:引用常量
在这里插入图片描述
好了,大家可以按照我的代码试一下,代码是特别基础的那种,主要是为了熟悉什么时候发生类的初始化~
这个也时看的狂神的视频,大家也可以去看~

猜你喜欢

转载自blog.csdn.net/weixin_45806131/article/details/107949388