2016-08-25 6 views
1

私はいつも1つのオブジェクトの属性に対してだけconstuctorを使います。 しかし、薄い、私、私は、この書いた:このArrayListのを格納している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); 

} 

は、それをオブジェクトの一部を行い、またはスタック上にあり、ヒープ内の配列への参照を持っていますか?

+0

オブジェクトの作成が終わるとすぐに 'j'への参照を失うので、それは問題ではないと私は思っています。 – Makoto

+2

'ArrayList'は全く必要ありません。これらの3行のコードは単に 'this.nesto = 8;' – David

+0

に置き換えることができます。実行が現在のスコープを終了すると( "中括弧"を参照)、そのスコープで参照されるすべての変数はGCに適格です。答えは:**保存されていない**(とにかく長くはない)。 –

答えて

2

ArrayListはヒープ上に作成され、ローカル変数jによって参照されるだけです。コンストラクタの実行後、ガベージコレクションの対象となります。

0

コンストラクターは、メソッドの動作方法と非常によく似ています。実行時に、コンストラクタ/メソッドの内部で定義するものはすべてローカル変数と呼ばれます。それらのスコープは、実行がコンストラクタ/メソッドの終了に達するとすぐに終了します。建設業者の後、あなたのリストは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のrefernceとともに存在しますか? –

関連する問題