0

私は基本的なクラスを持っています:

 public class SomeClass {

    private List<String> list = new ArrayList<String>();

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }   

}

メソッドで私はこのコードを持っています:

private void test(){

    SomeClass sc1 = new SomeClass();
    sc1.getList().add("a");
    sc1.getList().add("b");

    SomeClass sc2 = sc1;

    System.out.println(sc2.getList().size());

    sc1.getList().remove(0);
    System.out.println(sc2.getList().size());

    sc1=null;
    System.out.println(sc2.getList().size());

    sc2=null;
    System.out.println(sc2.getList().size());


}

私は受け取ります :

  • 2
  • 1
  • 1
  • NullPointerException

しかし、私は受け取ったでしょうが:

  • 2
  • 1
  • NullPointerException
  • NullPointerException(前のNullPointerExceptionがキャッチされた場合)

参照オブジェクトがに設定されている場合null、参照リンクは壊れていますか?説明ありがとうございます

4

4 に答える 4

12

参照オブジェクトがnullに設定されている場合、参照リンクは壊れていますか?

オブジェクトをnullに設定するような概念はありません。変数をnullに設定することしかできません。この文:

sc1=null;

...の値を変更し、sc1 それだけです

変数は、名前の付いた単純な保存場所です。保存場所には値があり、型が非プリミティブの変数の場合、その値は参照です。変数の値はオブジェクトではないことを理解することが非常に重要ですこれは単なる参照です。

したがって、このステートメント:

SomeClass sc2 = sc1;

sc2既存の変数()と同じ値で始まる新しい変数()を宣言するだけsc1です。2つの変数は完全に分離されており、そもそも同じ値を持っているだけです。

私は変数を一枚の紙と考えるのが好きです。一枚の紙には、数字などの原始的な値を付けることも、家の住所1を付けることもできます。次の手順を想像してみてください。

  • 家を建てる
  • その家の住所を一枚の紙に書いてください(sc1
  • sc1書き込みを別の紙にコピーします( sc2
  • 上のアドレスをこすりますsc1
  • 住所が記載されている家を訪ねるsc2

それはあなたがここでしていることと似ています...そして明らかに価値をこすり落とすことは家にも一枚の紙sc1にも影響を与えません。sc2

ここで、なぜ2、次に1が表示されるのかについては、次の手順を想像してください。

  • 家を建てる
  • その家の住所を一枚の紙に書いてください(sc1
  • 家を見つけるために使用sc1し、玄関先に2つの小包を置きます
  • sc1書き込みを別の紙にコピーします( sc2
  • 家を見つけるために使用sc1し、見つけた小包の数を叫びます
  • 家を見つけるために使用sc1し、1つの小包を奪う
  • 家を見つけるために使用sc2し、見つけた小包の数を叫びます

最初に2と叫び、次に1と叫びます。紙の値を変更するのではなく、小包を追加または削除することで家自体を変更します。


1参照は必ずしもメモリアドレスではないことを私は知っています。これは純粋に類推のためであり、私が役立つと思ったものです。

于 2013-01-23T17:31:35.357 に答える
5

に設定sc2すると、参照sc1コピーします。2つの変数は同じオブジェクトを参照しますが、同じ変数にはなりません。に設定sc1nullても変更されませんsc2。同じSomeClassオブジェクトを参照するため、そのメソッドNullPointerExceptionにアクセスするときに変更はありません。getList()

于 2013-01-23T17:30:51.600 に答える
0

あなたが作るならSomeClass sc1 = new SomeClass()、あなたはのようなものを作りますsc1->OBJECT。することは、作ること、またはsc2=sc1のようなものです。したがって、sc1参照を変更してもsc2は変更されません。sc2->sc1->OBJECTsc2->OBJECT

于 2013-01-23T17:32:19.253 に答える
0

物事が指し示すところを見てみましょう:

SomeClass sc1 = new SomeClass();

ここでは、sc1が新しく作成されたクラスを指している(への参照があります)が、sc2は画像にさえありません。

SomeClass sc2 = sc1;

sc1とsc2の両方が同じオブジェクトを指している。

sc1=null;

sc2がまだオブジェクトを指しているため、オブジェクトはそのままです。Sc1はnullであり、何も指していません。sc2のため、オブジェクト自体はガベージコレクションの対象にはなりません。

sc2=null;

これで、sc1とsc2の両方が何も指していません。オブジェクトへの参照はなく、ガベージコレクターは(最終的に)オブジェクトを解放します。

ステップバイステップでわかるように、「参照リンクが壊れています」が、すべての参照が失われるまで、オブジェクト自体は実際には影響を受けません。あなたがそれへの単一の参照を持っている限り、オブジェクトは生きています。

于 2013-01-23T17:35:05.437 に答える