1. 陣列類簡介
在java中,陣列也是一種引用型別,即是一種類。
我們來看一個例子,理解一下陣列類:
public static void main(String[] args) {
Class c = int[].class;
Class cIn = Integer[].class;
Class ccIn = Integer[][].class;
System.out.println(c.getName());
System.out.println(cIn.getName());
System.out.println(ccIn.getName());
Class f = float[].class;
Class flo = Float[].class;
System.out.println(f.getName());
System.out.println(flo.getName());
}
複製程式碼
輸出的結果:
[I [Ljava.lang.Integer; [[Ljava.lang.Integer; [F [Ljava.lang.Float;
上面的輸出結果就是通過Class的toString()
方法輸出的內容,可以看出規律,“[”表示一維陣列,“[[”則表示二維陣列,如此類推下去。同時,如果是引用型別,則還要“[”後面還要跟一個”L“+類的全限定名。而如果是基本型別,則只要跟對應的大寫字母。
2. 陣列類的分類
從上面的例子的輸出可以看出,陣列類是在JDK中是有分類的:對於一維的基本型別陣列,輸出”[“,而對於一維的引用陣列則輸出 ”[L“,多了一個”L“。
陣列類可以分類可以分成兩類:
- 基本型別的陣列類;
- 引用型別的陣列類;
這兩種陣列類的最大區別在於他們的祖先類不同。
2.1 基本型別的陣列類
對於基本型別來說,基本型別陣列類的父類一個,就是Object類。
public static void main(String[] args) {
int[] a = new int[3];
Object o = a;//編譯通過,型別轉換成功;
//列印一下陣列的超類
System.out.println("int[]的superClass是: "+int[].class.getSuperclass());
}
複製程式碼
執行結果:
int[]的superClass是: class java.lang.Object
2.2 引用型別的陣列類
對於引用型別的陣列類,其所有的祖先類除了Object類外,還包括下面所說的類: 如果A是B的祖先類,A[]也是B[]的祖先類,其他維度也如此類推,不同維度間,沒有任何關係。
看下面的例子:
public class Test_3 {
public static void main(String[] args) {
Children[] childrens = new Children[3];
Ancestor[] ancestors = childrens; //編譯通過,型別上轉成功
// 判斷childrens 是不是 Ancestor或者是其子類的例項,進一步證明 Children[] 是 Ancestor[]的子孫類
System.out.println("childrens instanceof Ancestor[] : " + (childrens instanceof Ancestor[]));
}
}
class Ancestor{//祖先類
}
class Parent extends Ancestor{//父類,繼承於Ancestor
}
class Children extends Parent{//子類,繼承於Parent
}
複製程式碼
執行結果:
childrens instanceof Ancestor[] : true
上面的例子中,因為Ancestor
是Children
的祖先類,所以Ancestor[]
也是Children[]
的祖先類。
如果這時候我們呼叫執行下面的程式碼:
System.out.println(Children[].class.getSuperclass());
複製程式碼
輸出的結果卻是:
class java.lang.Object
咦,為什麼引用型別陣列Children[]
的父類是Object類,那麼與上面所說的
Ancestor[]
是Children[]
的祖先類
起了衝突。因為如果父類是Object,Object類是根類了,那麼祖先類就只有一個,就不可能再有其他的祖先類
這是為什麼呢?
我們看一下getSuperclass()
的API描述:
public Class<? super T> getSuperclass() 返回表示此 Class 所表示的實體(類、介面、基本型別或 void)的超類的 Class。如果此 Class 表示 Object 類、一個介面、一個基本型別或 void,則返回 null。如果此物件表示一個陣列類,則返回表示該 Object 類的 Class 物件。 -返回: 此物件所表示的類的超類。
原來,getSuperclass
對於呼叫者是陣列類的物件的話,那麼直接返回Object類的class物件。
出處:http://www.cnblogs.com/jinggod/p/8428062.html
文章有不當之處,歡迎指正,你也可以關注我的微信公眾號:
好好學java
,獲取優質資源。