1. 클래스를 적극적으로 참조하면 클래스 초기화가 발생합니다. 가상 머신이 시작되면 먼저 메인 메소드가 있는 클래스를 초기화합니다.
클래스의 객체 인스턴스화
클래스의 정적 멤버(최종 상수 제외) 및 정적 메소드 호출
java의 메소드 사용 .lang.reflect 클래스 Reflection 호출을 수행하는 패키지
클래스를 초기화할 때 상위 클래스가 초기화되지 않은 경우 해당 상위 클래스가 먼저 초기화됩니다
2. 클래스의 수동적 참조, 클래스 초기화 없음. 발생합니다
정적 필드에 액세스하면 실제로 이 필드를 선언하는 클래스만 초기화됩니다. 예: 하위 클래스를 통해 상위 클래스의 정적 변수를 참조하면 하위 클래스가 초기화되지 않습니다.
배열을 통해 클래스 참조를 정의하면 이 클래스의 초기화가 트리거되지 않습니다.
상수를 참조하면 초기화가 트리거되지 않습니다. 이 클래스의 (상수는 링크 단계에 있음) 호출 클래스의 상수 풀에 저장됩니다.)
Instance
package com.volcano.reflection; //什么时候会发生类的初始化,除了第一个注释一直开着,其他都要独立打开测试,否则不准确 public class TestReflection3 { static { //1.虚拟机启动就会最先初始化main方法所在的类 会 System.out.println("main方法被加载"); } public static void main(String[] args) throws ClassNotFoundException { //2.实例化一个对象 会 //new Father(); //3.调用类的静态成员(除了final常量)和静态方法 会 //System.out.println(Son.a); //4.使用java.lang.reflect包的方法对类进行反射调用 会 //Class cls = Class.forName("com.volcano.reflection.Father"); //5.当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 会 //new Son(); //6.当访问一个静态域时,只有真正声明这个域的类才会被初始化 不会 //System.out.println(Father.a);//两个都是只加载Father //System.out.println(Son.a);//因为a是Father的静态成员 //7.通过数组定义类引用,不会触发此类的初始化 不会 //Father[] fathers = new Father[10]; //8.引用常量不会触发此类的初始化 不会 //System.out.println(Father.B); } } class Father{ static { System.out.println("Father被加载"); } static int a=100; static final int B = 300; } class Son extends Father{ static { System.out.println("Son被加载"); } static int c=200; }
위 내용은 고쳐 쓰기: Java 클래스를 참조하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!