1 Rujukan aktif kelas pasti akan menyebabkan permulaan kelas. Apabila mesin maya dimulakan, mula-mula mulakan kelas di mana kaedah utama terletak
Semerta objek kelas
Panggil ahli statik kelas (kecuali pemalar akhir) dan kaedah statik
Gunakan kaedah pakej java.lang.reflect untuk membuat panggilan reflektif ke kelas
Apabila memulakan kelas, jika kelas induknya belum dimulakan, kelas induknya akan dimulakan dahulu
2 Rujukan pasif kelas, tiada permulaan kelas akan berlaku
Apabila medan statik diakses, hanya kelas yang benar-benar mengisytiharkan. medan ini akan dimulakan. Contohnya: apabila pembolehubah statik kelas induk dirujuk melalui subkelas, ia tidak akan menyebabkan subkelas dimulakan
Mentakrifkan rujukan kelas melalui tatasusunan tidak akan mencetuskan permulaan kelas ini
Pemalar rujukan tidak akan mencetuskan Permulaan kelas ini (pemalar disimpan dalam kumpulan pemalar kelas panggilan semasa fasa pautan)
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; }
Atas ialah kandungan terperinci Tulis semula: Apakah cara untuk merujuk kelas Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!