2015-11-08 14 views
7

をnullにオブジェクトのすべての参照を設定します。バーにアクセスできますか?もしそうなら、誰かがそうする方法を説明してください。は、私は次の操作を行うだろうか、Javaでは

+2

ありませんこれはJavaでは不可能です。変数の割り当てに関する規則では、変数の名前を使用して割り当てる必要があります。 – Nayuki

+0

私はbarをnullに設定すると、aとbにもnull参照があると思っています。それとも何が問題なの? –

+0

このチュートリアルを読んでください:http://www.javaranch.com/campfire/StoryPassBy.jsp – Nayuki

答えて

3

これはJavaでは不可能です。参照番号abは、barを使用してnullに設定することはできません。

理由 - Javaはpass by valueではなく、pass by referenceです。

+11

私はこれが正しい理由だとは思わない。 「値/参照渡し」は、メソッド呼び出しの評価戦略です。ここでメソッドは呼び出されません。 – xehpuk

5

いいえ、Javaではできません。

私はあなたのコードで何が起こったのか少し説明します。 ここではFoo bar = new Foo();というオブジェクトを作成し、変数barへの参照を入れました。

ここでFoo a = bar;Foo b = bar;は、変数abへの参照を入れます。だからあなたは今、1つのオブジェクトと3つの変数を指しています。

bar = null;bar変数をクリアします。したがって、オブジェクトを指す2つの変数(ab)と参照なしの変数(bar)があります。

2

CでありのようなJavaでデストラクタが本当にありません。

あなたがnullに複数のオブジェクトを設定したいことを知っていたなら、あなたはおそらく使用しますFooの配列を別のオブジェクトとして宣言するのではなく、その後、コンストラクタコール、instatiation/initializationにループを使用します。

Foo bar = new Foo(); 
Foo array[2] 
for (int i=0; i<array.length; i++) { 
    array[i] = bar; 
} 

次にあなたが再帰のために、これはあなたが任意の数のオブジェクトを処理することができますので、あなたがデータ構造にしたいと思う戦略で終わり

for (int i=0; i<array.length; i++) { 
    array[i] = null; 
} 

をループを使用することができますなど

+0

ところで、a = barと言うと、barの値をaにコピーしています。バーを変更しても、他のメモリ位置のコピーされた値は変更されません。私は、数学の人々は時々、CとJavaではdouble ==が双対対称であるという事実の後、等号が真であると仮定していることを知っています。単一の=は割り当てと呼ばれ、左の非対称矢印のように考えることができます。 Javaでは、オブジェクトをnullに設定すると、デストラクタを呼び出すC相当のオブジェクトになります。 –

+0

Re: "ヌルへの参照ではなく、barの値をnullに設定したい" ASCII値0は、文字通り文字列またはオブジェクトの末尾にあるnullを表します(ヌル終端文字列)。したがって、メモリ内の値がnullに変更された場合、クラス内で定義されているように、必要なメンバ関数、メンバ変数などを持たないため、Fooオブジェクトにはなりません。 –

関連する問題