java有兩個(gè)獲得類名的方法getClass()和class(),這兩個(gè)方法看似一樣垃杖,實(shí)則不然玉掸。這兩個(gè)方法涉及到了java中的反射摆寄。
反射
所謂反射垃环,可以理解為在運(yùn)行時(shí)期獲取對(duì)象類型信息的操作颂碘。傳統(tǒng)的編程方法要求程序員在編譯階段決定使用的類型异赫,但是在反射的幫助下,編程人員可以動(dòng)態(tài)獲取這些信息头岔,從而編寫更加具有可移植性的代碼塔拳。嚴(yán)格地說,反射并非編程語言的特性峡竣,因?yàn)樵谌魏我环N語言都可以實(shí)現(xiàn)反射機(jī)制靠抑,但是如果編程語言本身支持反射,那么反射的實(shí)現(xiàn)就會(huì)方便很多适掰。
類型類
我們知道在Java中一切都是對(duì)象颂碧,我們一般所使用的對(duì)象都直接或間接繼承自O(shè)bject類。Object類中包含一個(gè)方法名叫g(shù)etClass类浪,利用這個(gè)方法就可以獲得一個(gè)實(shí)例的類型類稚伍。類型類指的是代表一個(gè)類型的類,因?yàn)橐磺薪允菍?duì)象戚宦,類型也不例外,在Java使用類型類來表示一個(gè)類型锈嫩。所有的類型類都是Class類的實(shí)例受楼。
聯(lián)系
一般情況下,getclass()方法和class()方法是等價(jià)的呼寸,都可以獲得一個(gè)類型名艳汽,例如下面的代碼:
class A{
public void func(){
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getClass()+" "+A.class);
}
}
輸出的結(jié)果為:class A class A
區(qū)別:
兩者最直接的區(qū)別就是,getClass() 是一個(gè)類的實(shí)例所具備的方法对雪,而class() 方法是一個(gè)類的方法河狐。
另外getClass() 是在運(yùn)行時(shí)才確定的,而class() 方法是在編譯時(shí)就確定了瑟捣。
例如下面的程序:
class A{
public void func(){
}
}
class B extends A{
}
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
A ab = new B();
System.out.println(a.getClass()+" "+A.class);
System.out.println(b.getClass()+" "+B.class);
System.out.println(ab.getClass());
ab = a;
System.out.println(ab.getClass());
}
}
結(jié)果:
class A class A
class B class B
class B
class A
從最后的結(jié)果為class B來看馋艺,當(dāng)出現(xiàn)繼承和多態(tài)是,getclass和class方法確實(shí)有所不同迈套,因?yàn)槭窃谶\(yùn)行時(shí)確定的捐祠,所以結(jié)果是ab在運(yùn)行到這一時(shí)刻時(shí)所屬的類型