2016-08-25 35 views
1

我總是隻爲一個對象的屬性使用構造函數。 但我薄時寫此:存儲從java中的構造函數的值?

public Predmet(int esp,int obaveze,int cena){ 
    this.cena=cena; 
    this.obaveze=obaveze; 
    this.esp=esp; 

    List j = new ArrayList(); 
    j.add(8); 
    this.nesto=(int) j.get(0); 

} 

其中存儲此ArrayList,不是部分的對象,或者是上堆疊並且在堆參照數組?

+0

我懷疑這很重要,因爲只要對象完成構造就會失去對'j'的引用。 – Makoto

+2

'ArrayList'完全沒有必要。這三行代碼可以替換爲:'this.nesto = 8;' – David

+0

一旦執行退出當前作用域(讀取「大括號」),那麼在該作用域中僅引用的所有變量都適用於GC。所以答案是:**它沒有被存儲**(反正不長)。 –

回答

2

ArrayList在堆上創建,並且只能從堆棧中的本地變量j引用。構造函數執行後,它將有資格進行垃圾回收。

0

構造函數的工作方式非常類似。在運行時,你在構造函數/方法中定義的任何東西都稱爲局部變量。只要執行到達構造函數/方法的結尾,它們的作用域就會結束。在consturctor之後,您的列表將符合GC的條件。但是,this.nesto仍然會獲得值8作爲其原始類型。

+1

這裏沒關係,如果nesto是一個基元或對象引用... – Puce

0

首先,請不要使用單個變量名!這是不好的做法,使文件難以閱讀。使用更具描述性的名稱有助於提高代碼的可讀性。

List j創建的方式,它只存在於構造函數的作用域中。在您的構造函數之後,List j不再可用。如果您希望在構造函數之後可以訪問它,請爲該對象提供一個字段。例如:

public class Example { 
    private int specialNumber; 
    private List<Integer> numberList; 
    /** 
    * Constructs a new Example Object 
    */ 
    public Example(int exampleNum){ 
     // specialNumber can be accessed from a Getter method (getSpecialNumber) 
     this.specialNumber = exampleNum; 
     this.numberList = new ArrayList<Integer>(); 
     this.numberList.add(exampleNum); 
     // numberList is a field of this Example now 
     List<Integer> disappearingList = new ArrayList<Integer>(); 
     disappearingList.add(exampleNum); 
     // After this method finishes, disappearingList will be gone 
    } 
    // disappearingList is no longer accessible 
    /** 
    * Gets this Example's specialNumber value 
    * @return int this.specialNumber 
    */ 
    public int getSpecialNumber(){ 
     return this.specialNumber; 
    } 
    /** 
    * Gets this Example's numberList 
    * @return List<Integer> this.numberList 
    */ 
    public List<Integer> getNumberList(){ 
     return this.numberList; 
    } 
} 

有可能是掛接到一些Java的清洗方法,將其拉出來一個辦法,但會變得有些混亂。如果您希望能夠在另一個對象內創建一個對象,並在構造函數之後使用它,它必須保存爲一個字段。

+0

Tnx,但我有一個問題,我刪除了GC,但如果我有numberList = disapearingList? –

+0

如果numberList = disappearingList,那麼由於Java存儲對象的方式而將disappearingList的值保存到numberList中(http://stackoverflow.com/questions/12740657/how-does-java-saving-object-reference-work) – Brydenr

+0

如果這個numberList引用了disapearingList,那麼這個列表仍然會存在於numberList中的引用? –