1. 程式人生 > >Java中9大內建基本資料型別Class例項和陣列的Class例項

Java中9大內建基本資料型別Class例項和陣列的Class例項

1、Java中9大內建幾本資料型別:
對於物件來說,可以直接使用物件.getClass()或者Class.forName(className);類名.class都可以獲取Class例項.
但是我們的基本資料型別,就沒有類的許可權定名,也沒有getClass方法.
問題:那麼如何使用Class類來表示基本資料型別的Class例項?
byte,short,int,long,char,float,double,boolean,void關鍵字
上述8種類型和void關鍵字,都有class屬性.
表示int的Class物件: Class clz = int.class;
表示boolean的Class物件: Class clz = boolean.class

;
表示void的Class物件:Class clz = void.class;
所有的資料型別都有class屬性,表示都是Class物件.
思考:
int的包裝類是Integer
Integer.class ==?== int.class 相等嗎????
結果是false,說明是兩份位元組碼.

Integer 和int是同一種資料型別嗎? 不是

但是在八大基本資料型別的包裝類中都有一個常量:TYPE,
TYPE表示的是該包裝類對應的基本資料型別的Class例項.
如:<pre><code>
Integer.TYPE----->int.class

Integer.TYPE==int.class;//YES

Integer.TYPE == Integer.class;//ERROR</pre></code>
摘自jdk原始碼:基本資料型別包裝類TYPE的實現。

 /** The {@code Class} instance representing the primitive type
 * {@code int}.
 *
 * @since   JDK1.1
 */
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");

 /** Return the Virtual Machine's Class object for the named
 * primitive type.
 */
static native Class getPrimitiveClass(String name);

2、陣列型別的Class例項
每個陣列屬於被對映為 Class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件(摘自JDK原話)。
陣列的Class例項:
String[] sArr1 ={"A","C"};
String[] sArr2 = {};
String[][] sArr = {};
int[] sArr = {};
表示陣列的Class例項:
String[] sArr1 = {"A","C"};
Class clz = String[].class;//此時clz表示就是一個String型別的一位陣列型別

所有具有相同元素型別和維數的陣列才共享同一份位元組碼(Class物件);
注意:和陣列中的元素沒有一點關係.

eg:<pre><code>
public static void main(String[] args) {

    String[] s1 = {};
    String[] s2 = {"A"};
    String[] s3 = {"A","b"};
    int[] i ={};    
    System.out.println(s1.getClass() == s2.getClass());//true
    System.out.println(s1.getClass() == s3.getClass());//true
    System.out.println(s2.getClass() == s3.getClass());//true
    
    String[][] s4 = {{"1","2"}};
    Class zz = s4.getClass();
    System.out.println(s2.getClass() == zz);//false
    Class zz1 = i.getClass();
    System.out.println(s2.getClass() == zz1);//false    
}