2016-06-17 207 views
-1

我有這樣的代碼在我的Java文件:初始化最終靜態變量

private ClassA() {} 
private static final ClassA groupA[] = new ClassA[5]; 


public ClassA getInstance() { 
    return groupA[2]; 
} 

我需要顯式調用構造函數來創建單獨的實例或將默認的構造函數被自動調用?

如果此代碼除了爲5個引用分配空間並將其初始化爲空,爲什麼以下代碼無效 - private static final ClassA groupA[5];

+1

你爲什麼不試試看? –

回答

0

也許是因爲您未針對ClassA的每個初始化使用「新」關鍵字。你只是初始化一個數組來保存它們。

2

我是否需要顯式調用構造函數來創建單個實例,還是自動調用默認構造函數?

你需要調用(使用new!)構造函數5次;例如

private static final ClassA groupA[] = new ClassA[] { 
    new ClassA(), new ClassA(), new ClassA(), new ClassA(), new ClassA()}; 

private static final ClassA groupA[] = new ClassA[5]; 

static { // NB: this is a static initializer block! 
    for (int i = 0; i < groupA.length; i++) { 
     groupA[i] = new ClassA(); 
    } 
} 

如果此代碼是做什麼,但分配5個引用空間,它們初始化爲null,

...這是...

爲什麼是下面這段代碼無效的?

private static final ClassA groupA[5]; 

上面的代碼甚至沒有創建一個數組。由於它沒有這樣做,並且(可能)您沒有static初始化程序塊降低,因此無法初始化static。這使得它變得毫無用處。

第二個問題是上面的代碼在語法上是無效的。您不能在Java中的數組聲明中包含大小。大小隻能在數組初始化中指定。

這裏是上面的語法有效的版本:

private static final ClassA groupA[]; 

或更好

private static final ClassA[] groupA; 

這兩種形式意味着同樣的事情,但Java的風格指南說是不好用古老的C語法。並且請注意,我們仍然有初始化數組需要處理的問題。

0

我需要顯式調用構造函數來創建單獨的實例

是的,因爲你所做的一切是由空數組。

爲什麼下面那段代碼無效 - private static final ClassA groupA [5];

由於對象類型是數組,因此該段代碼在語法上不正確,因此該大小不是聲明的一部分。在數組的初始化中,5位於等號的右側。

0

要創建Array含有5個元素groupA(組A [0],A組[1],A組.. [4])與每個時隙存儲CLASSA的實例你會做:

ClassA[] groupA = new ClassA[5]; 

Array無法調整大小,因此在實踐中ArrayList更加靈活。 列表提供了更多的靈活性。

List<classA> groupList = List<classA>(); //Without inference 

List<classA> groupList = List<>(); //With inference (Java 8) 

現在需要將元素添加到數組:

groupA[4] = generateClassA(); //adds instance of classA to fifth element of array. 

groupList.add(generateClassA()); //將第一個元素添加到列表中

檢查YouTube上的Derek Banas Java教程 - 他有關於Java的最佳教程。