java基礎(十) 陣列型別

歐陽思海發表於2018-04-19

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

上面的例子中,因為AncestorChildren的祖先類,所以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,獲取優質資源。

相關文章