.class和getClass()深度理解

能用一句話說清楚的絕不多說,能從原理講起的,絕不從表面講解。

java有兩個獲得類名的方法getClass()和class(),這兩個方法看似一樣,實則不然。這兩個方法涉及到了java中的反射。.class 用於類  而 getClass()用於對象。.class和getClass()使用java程序可以得到運行時的類,其實得到就是 Class<T> 一個泛型 的 Class對象 T就是你所調用對象的運行時的類 的類型。

反射

所謂反射,可以理解爲在運行時期獲取對象類型信息的操作。傳統的編程方法要求程序員在編譯階段決定使用的類型,但是在反射的幫助下,編程人員可以動態獲取這些信息,從而編寫更加具有可移植性的代碼。嚴格地說,反射並非編程語言的特性,因爲在任何一種語言都可以實現反射機制,但是如果編程語言本身支持反射,那麼反射的實現就會方便很多。

聯繫
一般情況下,getclass()方法和class()方法是等價的,都可以獲得一個類型名,例如下面:

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);
    }

}

輸出的結果爲:class A class A

區別:
兩者最直接的區別就是,getClass()是一個類的實例所具備的方法,而class()方法是一個類的方法。
另外getClass()是在運行時才確定的,而class()方法是在編譯時就確定了。

例如下面的程序:

class Father{
public void showName()
{
 System.out.println("Father...");
}
}
class Child extends Father{
public void showName()
{
 System.out.println("children");
}
}

Father father = new Child();

System.out.println(Father.class);  結果是 Father

System.out.println(father.getClass()); 結果是Child

Class主要用於反射機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章