2

ちょっと変わった質問です。次のコードは、DumObj という単純な Java オブジェクトを作成し、setter メソッドを使用して文字列値を設定するだけです。次に、DumObj をパラメーターとして使用して、TestBed クラスからいくつかのメソッドが呼び出されます。

最初は、TestBed.updateId(DumObj) を呼び出しても DumObj に影響はなく、「apple」に設定された ID の初期値は同じままであると考えていました。(値渡し全体のため)

ただし、ID の値は「オレンジ」の更新された値に設定されました。わかりました、それは変だと思ったので、別のメソッド TestBed.setToNull(DumObj) を書きました。このメソッドは DumObj を null に設定するだけなので、getId() メソッドを呼び出すと、null ポインター例外が発生することが予想されました。

しかし、私が得た出力は、ID の値がまだ「オレンジ」に設定されていました。

コードは次のとおりです。

    public static void main(String[] args) 
    {   
            TestBed test = new TestBed();
            DumObj one = new DumObj();

            one.setId("apple");
            System.out.println("Id : " + one.getId());

            test.updateId(one);
            System.out.println("Id : " + one.getId());

            test.setToNull(one);
            System.out.println("Id : " + one.getId());
    }

    public void updateId(DumObj two)
    {
            two.setId("orange");
    }

    public void setToNull(DumObj two)
    {
            two = null;
    }

出力は次のとおりです。

    Id : apple
    Id : orange
    Id : orange

おそらく私が見落としているのは本当に単純なことですが、誰かがこの動作を説明してもらえますか? Javaは値渡しではありませんか?

4

5 に答える 5

2

あなたがするとき:

two = null;

two変数参照を null に設定しているだけです。が指していたオブジェクトはまだ存在し、 によって参照されていoneます。

一方、次の場合:

two.setId("orange");

oneと の両方で参照されているオブジェクトを変更していますtwo

于 2013-09-12T11:51:50.963 に答える
0

はい、Java は値渡しです。しかし、変数は実際にはヒープに割り当てられたオブジェクトへのポインターです。したがって、値で渡されるのはオブジェクトではなくポインターです。

あなたの例では:

public void updateId(DumObj two)
{
        two.setId("orange");
}

1 つ目は、変数 (ポインター) を値でupdateId()渡します。つまり、ポインターのコピーを受け取ります。しかし、ここで行っているのは、ポインターが指すオブジェクトを変更することです。そのため、呼び出し元の関数に戻ったときにオブジェクトが変更されました。

public void setToNull(DumObj two)
{
        two = null;
}

2 番目のケースでは、元のポインター自体ではなく、元のポインターのコピーに割り当てnullているため、関数呼び出しは元の変数ではまったく効果がありません。

于 2013-09-12T11:54:56.197 に答える
0

updateId を呼び出すと、新しい参照変数 2 と古い参照変数 1 の両方がヒープ内の同じオブジェクトを参照するため、1 つを変更すると他の参照変数に反映されます。

setToNull を再度呼び出すと、新しい参照変数 2 と古い参照変数 1 の両方が同じオブジェクトを参照します。ただし、ここでtwo = nullを実行すると、変数 2 のみが null オブジェクトを指します。ただし、参照変数 1 はまだ同じオブジェクトを指しています。two==nullを実行すると、それによって参照されるオブジェクトの値は変更されませんが、参照変数が null に参照されます。

setToNull メソッドの場合、two=new DumObj(); と記述します。次に、ヒープ内に新しいオブジェクトが作成され、two がこの新しいオブジェクトを指します

メインコードで syso 内に one.getId() を記述すると、バナナではなくオレンジが出力されます。

私が助けてくれることを願っています。

于 2013-09-12T11:56:42.860 に答える
0

Java は、オブジェクトの一種の「値による参照の受け渡し」です。ではsetToNull(DumObj two)、two はオブジェクトへの参照です。と言うとtwo = null;、これで two はオブジェクトではなく参照になります。オブジェクトを変更しません。一方、 のようなtwo.setId("blue")ことをすると、参照するオブジェクトが変更されtwoます。

于 2013-09-12T11:52:54.373 に答える