Java中泛型Class 、T與Class 、 Object類和Class類、 object.getClass()和Object.class


一.區別

單獨的T 代表一個類型(表現形式是一個類名而已) ,而 Class<T>代表這個類型所對應的類(又可以稱做類實例、類類型、字節碼文件), Class<?>表示類型不確定的類

Class<T>表示T類型的字節碼文件,意思是:

Class<T> 相當於Class<T> c=T.class,T  t  new T() ; 

或者Class<T> c= t.getClass(); 

通過以上可以獲取類名為c.getName();

 

解釋:Class<T> ct=T.class,T  t  new T() ; 與Class c=T.class,T  t  new T() ; 

ct泛型指的是ct只能是T的字節碼,而c可以是任何類的字節碼。所以用ct用法更好

 E - Element (在集合中使用,因為集合中存放的是元素)
T - Type(Java 類)
K - Key(鍵)
V - Value(值)
N - Number(數值類型)
? - 表示不確定的java類型
舉例說明:
Set<T> 表示 集合里 是 T類的實例
List<E> 表示 集合里 是 E類的實例
List<?> 表示 集合里的對象類型不確定,未指定
List 同 List<?> 是一樣的。
泛型的作用: 1、用泛型:
Java代碼 收藏代碼
List<T> list=new ArrayList<T>();
T t=list.get(0); 2、不用泛型:
Java代碼 收藏代碼
List list=new ArrayList();
T t=(T)list.get(0); 

二、如何創建一個Class<T>類型的實例?

      就像使用非泛型代碼一樣,有兩種方式:調用方法 Class.forName() 或者使用類常量X.class。      Class.forName() 被定義為返 回 Class<?>。另一方面,類常量 X.class 被定義為具有類型 Class<X>,所 以 String.class 是Class<String> 類型的。

三、方法中為什么需要<T> T修飾呢

泛型的聲明,必須在方法的修飾符(public,static,final,abstract等)之后,返回值聲明之前。

public static <T> T request2Bean(HttpServletRequest request,Class<T> clazz){}

其中第一個<T>是與傳入的參數Class<T>相對應的,相當於返回值的一個泛型,后面的T是返回值類型,代表方法必須返回T類型的(由傳入的Class<T>決定)

四、Object類和Class類

Object類和Class類沒有直接的關系。
Object類是一切java類的父類,對於普通的java類,即便不聲明,也是默認繼承了Object類。典型的,可以使用Object類中的toString()方法。

Class類是用於java反射機制的,一切java類,都有一個對應的Class對象,他是一個final類。Class 類的實例表示,正在運行的 Java 應用程序中的類和接口。 

平時看代碼時,總是碰到這些即熟悉又陌生的名次,每天都與他們相見,但見面后又似曾沒有任何的交集,所以今天我就來認識下這兩個江湖俠客的背景:

CLASS

    在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成后,在生成的.class文件中,就會產生一個Class對象,用於表示這個類的類型信息
獲取Class實例的三種方式:
    (1)利用對象調用getClass()方法獲取該對象的Class實例;
    (2)使用Class類的靜態方法forName(),用類的名字獲取一個Class實例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
    (3)運用.class的方式來獲取Class實例,對於基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例
    在newInstance()調用類中缺省的構造方法 ObjectnewInstance()(可在不知該類的名字的時候,常見這個類的實例) Creates a new instance of the class represented by this Classobject.
    在運行期間,如果我們要產生某個類的對象,Java虛擬機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class文件並加載它。一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象

    Class對象的生成方式如下:

    1.Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名);
    2.類名.class;
    3.實例對象.getClass();

五、object.getClass()和Object.class的區別

兩者的區別如下: 
類名.class叫做“類字面量”,因class是關鍵字, 所以類名.class編譯時確定。而getclass()是某個具體的方法來調用,是運行時根據實際實例確定,getClass()是動態而且是final的。 
例如: 
String.class 是能對類名的引用取得在內存中該類型class對象的引用,而new String().getClass() 是通過實例對象取得在內存中該實際類型class對象的引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。