Class對(duì)象是用來(lái)創(chuàng)建類(lèi)的常規(guī)對(duì)象的,當(dāng)我們編譯一個(gè)Java類(lèi)就會(huì)同時(shí)產(chǎn)生一個(gè)與該類(lèi)相對(duì)應(yīng)的Class對(duì)象(保存在.class文件中)。該Class對(duì)象中保存了創(chuàng)建對(duì)象所需的所有信息。
共有三種產(chǎn)生Class對(duì)象的方法下面分別說(shuō)明之:
1.public static Class< > Class.forName("完整的類(lèi)名") throws ClassNotFoundException;
public static Class< > forName(String name, boolean initialize,
ClassLoader loader) throws ClassNotFoundException
假若我們用Class.forName("");的方式獲取Class對(duì)象,其實(shí)就相當(dāng)于Class.forName("完整類(lèi)名", true, this.getClass().getClassLoader())也就是說(shuō)在默認(rèn)情況下在產(chǎn)生Class對(duì)象的同時(shí)會(huì)對(duì)該Class對(duì)象進(jìn)行初始化(若以前沒(méi)有初始化過(guò))。
2.public final Class< extends Object> getClass()
可以通過(guò)任何實(shí)例對(duì)象來(lái)引用該方法來(lái)獲取相應(yīng)的Class對(duì)象。使用此種方式的前提是我們需要產(chǎn)生相應(yīng)的實(shí)例對(duì)象。
3.類(lèi)名.class 此種方式產(chǎn)生Class對(duì)象較前兩種簡(jiǎn)單,無(wú)需第一種還要進(jìn)行異常處理(在編譯期就進(jìn)行錯(cuò)誤的檢查了)。此種方式不會(huì)自動(dòng)初始化該Class對(duì)象。初始化被延遲到對(duì)靜態(tài)方法(包括構(gòu)造方法)或非常數(shù)靜態(tài)域進(jìn)行首次引用時(shí)才進(jìn)行。
import java.util.*; class Initable{ static final int staticFinal = 47; static final int staticFinal2 = ClassInitialization.rand.nextInt(100); static{ System.out.println("Initialization Initable"); } } class Initable2{ static int staticNoFinal = 147; static{ System.out.println("Initialization Initable2"); } } class Initable3{ static int staticNoFinal = 74; static{ System.out.println("Initialization Initable3"); } } public class ClassInitialization { public static Random rand = new Randdom(47); public static void main(String[] args){ Class initable = Initable.class; //不會(huì)引起初始化 System.out.println("after creating Initable reference"); System.out.println(Initable.staticFinal); //引用編譯器常量不會(huì)引起初始化 System.out.println(Initable.staticFinal2); //引起初始化 System.out.println(Initable2.staticNoFinal); //引用非編譯期常量會(huì)引起初始化 Class initable3 = Class.forName("Initable3"); //默認(rèn)會(huì)引起初始化 System.out.println("after creating Initable3 reference"); System.out.println(Initable3.staticNoFinal);//前面已經(jīng)初始化此處不用再初始化 } } |
輸出結(jié)果:
after creating Initable reference
47
Initialization Initable
258
Initialization Initable2
147
Initialization Initable3
after creating Initable3 reference
74
如果一個(gè)static final值是編譯期常量,那么對(duì)該值的引用無(wú)需對(duì)其所在類(lèi)進(jìn)行初始化;若僅僅是static和final但不是編譯期常量,則會(huì)引發(fā)初始化其類(lèi)。若是引用一個(gè)static值則要進(jìn)行鏈接并對(duì)其所在類(lèi)進(jìn)行初始化。
聯(lián)系客服