2013-10-07 59 views
1

我正在處理一個處理Java數組操作的任務。現在我必須刪除數組中間的元素。現在我知道數組一旦創建就無法改變長度。所以我決定創建一個新對象,並將前一個參考點指向我的新數組。通過void方法引用新對象

public class A{ 
    public static void main(String[] args){ 
    B test = new B(val); 
    test.cut(2,4); 
    test.display(); 
    } 

class B{  
    private Obj[] array; 

    B(Obj val){ 
    construct something 
    } 

    public void cut(int i, int j){ 
    B newObject = new B(val); 
     ... 
    newObject.array = this.array; 
    newObject = this; 
    } 
} 

問題是,當我顯示測試對象時,它只會顯示原始測試對象內容而不是newObject內容。由於這是一個無效的方法,我不能返回一個對象。那麼我如何引用新對象呢?我的剪切方法的最後兩行似乎完全沒有效果。我知道ArrayList對於這樣的事情會更可取,但這是一項家庭作業,我們不得不使用數組。

回答

2

現在我知道數組一旦創建就無法改變長度。

這是事實。

參考指向B對象實例一個數組裏面可以改變(因爲你沒有申報其final):

public void cut(int i, int j){ 

    Object[] newArray = new Object[len]; 

    //... copying array content ... 

    this.array = newArray; 
} 

謹防線程安全問題這樣可變性的原因。可變對象通常是在...

+0

哇,這太聰明瞭。我不敢相信我沒有想到這一點。它的作品!我一直在創造整個對象,我一直認爲這是魯莽的。你會建議只更改字段引用而不是對象引用更好嗎? – Nopiforyou

0

皺了皺眉頭如果轉讓規則允許使用Arrays類的,這是你可以改用什麼自己cut方法:cut

newArray = Arrays.copyOfRange(oldArray, from, to); 
0

在該方法創建B的新對象,然後爲其分配this引用。由於this引用(實際對象)根本沒有被改變,所以這並沒有影響,因爲newObject僅在此方法內可見,一旦它終止,對象就消失了。

雖然你在同一個班級B你不必創建一個新的對象,只是爲了改變它所擁有的數據。您可以創建一個新陣列並將原始內容複製到該陣列。

要複製內容,您可以使用方法System#arraycopy。如果你不被允許使用任何jdk幫助功能,那麼你可以循環訪問原始數組,然後根據需要將元素複製到新的數組中。

+0

類似的建議作爲ppeterka66,雖然我沒有使用任何其他方法如複製。謝謝你! – Nopiforyou

相關問題