1、Java中9大內(nèi)置幾本數(shù)據(jù)類型:
對(duì)于對(duì)象來說,可以直接使用對(duì)象.getClass()
或者Class.forName(className);
、類名.class
都可以獲取Class實(shí)例.
但是我們的基本數(shù)據(jù)類型,就沒有類的權(quán)限定名,也沒有getClass
方法.
問題:那么如何使用Class
類來表示基本數(shù)據(jù)類型的Class
實(shí)例?
byte
,short
,int
,long
,char
,float
,double
,boolean
,void
關(guān)鍵字
上述8種類型和void
關(guān)鍵字,都有class
屬性.
表示int
的Class對(duì)象: Class clz = int.class
;
表示boolean
的Class對(duì)象: Class clz = boolean.class
;
表示void
的Class對(duì)象:Class clz = void.class
;
所有的數(shù)據(jù)類型都有class屬性,表示都是Class對(duì)象.
思考:
int
的包裝類是Integer
Integer.class ==?== int.class
相等嗎?惨驶?冰垄??
結(jié)果是false
,說明是兩份字節(jié)碼.
Integer 和int是同一種數(shù)據(jù)類型嗎? 不是
但是在八大基本數(shù)據(jù)類型的包裝類中都有一個(gè)常量:TYPE,
TYPE表示的是該包裝類對(duì)應(yīng)的基本數(shù)據(jù)類型的Class實(shí)例.
如:<pre><code>
Integer.TYPE----->int.class
Integer.TYPE==int.class;//YES
Integer.TYPE == Integer.class;//ERROR</pre></code>
摘自jdk源碼:基本數(shù)據(jù)類型包裝類TYPE
的實(shí)現(xiàn)闷堡。
/** 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、數(shù)組類型的Class實(shí)例
每個(gè)數(shù)組屬于被映射為 Class 對(duì)象的一個(gè)類疑故,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對(duì)象(摘自JDK原話)杠览。
數(shù)組的Class實(shí)例:
String[] sArr1 ={"A","C"};
String[] sArr2 = {};
String[][] sArr = {};
int[] sArr = {};
表示數(shù)組的Class實(shí)例:
String[] sArr1 = {"A","C"};
Class clz = String[].class;
//此時(shí)clz表示就是一個(gè)String類型的一位數(shù)組類型
所有具有相同元素類型和維數(shù)的數(shù)組才共享同一份字節(jié)碼(Class對(duì)象);
注意:和數(shù)組中的元素沒有一點(diǎn)關(guān)系.
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
}
</pre></code>