0

java.swing を使用してアプリケーションを構築しています。メイン パネル、グリッド パネル (正方形を表示する)、および詳細パネル (各正方形の詳細を表示して編集できるようにする) があります。正方形もオブジェクトです。

マウス クリックをリッスンするメイン パネルがあり、グリッド パネルをクリックすると、グリッド パネルは四角形の ArrayList を調べ、クリックした四角形を見つけて返します。この正方形は、メイン パネルからディスプレイ パネルに渡され、ローカル変数 currentSquare が、渡された正方形と等しくなるように設定されます。

私が混乱しているのは、currentSquare を編集できることと、ArrayList 内の対応する正方形が編集されていることです! currentSquare のパブリック変数を変更したり、セッターを使用してそれらを変更したりできますが、効果は同じです。これは私が望んでいる効果ですが、編集された currentSquare を ArrayList に戻し、古い正方形を置き換えるには、ある種のゲッター/セッターが必要であるという印象を受けました。

なぜこれが起こっているのかについての私の現在の理論は、正方形がカスタムオブジェクトであるため、Java の参照と関係があるということですが、これが事実なのか、何が原因なのかはわかりません。最終的に、私はこの状況を引き起こすために何をしたかを知りたいのですが、これをそのままにしておくか、これに基づいて構築することが良い/大丈夫なプログラミングの実践であるかどうか (そして、このように動作するように構築した場合、それが壊れる可能性はどれくらいですか? )。

4

1 に答える 1

5

Java では、オブジェクトを使用してメソッドを呼び出す場合、オブジェクトのコピーではなく、オブジェクトへの参照を送信します。呼び出し元と呼び出し先の両方が同じオブジェクトを参照し、そのオブジェクトへの参照がすべてなくなると、そのオブジェクトはガベージ コレクションの対象になります。

プリミティブが値であるように、参照自体が値であるため、Java は「値渡し」と呼ばれます。オブジェクトでメソッドを呼び出すときは、オブジェクトのコピーではなく、オブジェクトのアドレスをパラメーターとして送信しています。アドレスの値にアクセスすることはできません。アドレスによって参照されるオブジェクトにのみアクセスできます。例:

import java.util.*;

class Test { 
    private static void test(Map<String, String> a, int b) {
        a.put("test", "def");
        b = 10; 
    }

    public static void main(String[] args) {
        Map<String, String> a = new HashMap<String, String>();
        a.put("test", "abc");

        int b = 5;

        test(a, b); 

        System.out.println(a);
        System.out.println(b);
    }   
}
{test=def}
5

上記は次のようなものにコンパイルされます。

test(0x123456, 5);
于 2012-12-07T21:44:47.103 に答える