2

私は状況に出くわし、非常に混乱しています。私を助けてください。このようなコードがあるとしましょう。

MyClass obj1 = null;

List<MyClass> testList = new ArrayList<MyClass>();

testList.add(obj1);//after this line of code, testList will have a "null" at first node

obj1 = new MyClass();//after this line of code, testList still have a "null"
                     //at first node...
                     //What I want is that testList's first node will become a new 
                     //MyClass object

これが私の理解の手順です(おそらく間違っています...):

  1. obj1には、何も指していないポインターが格納されています...
  2. testListは、「new ArrayList()」を保持するメモリを指すポインターを格納します。
  3. testListは、そのコレクションにobj1のポインターを追加します。
  4. obj1は、「new MyClass()」を指すポインタを格納します
  5. したがって、testList のobj1自動的に「new MyClass()」を指す必要があります。

申し訳ありませんが、プログラミングは初めてです...どんな助けも大歓迎です!

4

5 に答える 5

1
MyClass obj1 = null;

タイプobj1という名前の参照変数MyClassは、何も参照しません (NULL)。

List<MyClass> testList = new ArrayList<MyClass>();

We declare a reference variable called testList of type List and assign it to some newly created ArrayList object in heap.

testList.add(obj1);

List testList's first element is assigned the same reference which obj1 holds currently viz. NULL.

obj1 = new MyClass();

We created a new MyClass object in heap and assigned obj1 with its reference. But we haven't assigned any new reference to the List testList's first element, which was assigned the NULL reference, so it still points nowhere.

于 2013-04-18T17:53:40.697 に答える
0
  1. obj1 は何も指していません。ポインターは存在しません
  2. 新しいリストを作成すると、testList はそのリストを指します
  3. obj1 のポイントが null であり、存在しないため、リストに何も追加しません
  4. 新しいオブジェクトを作成すると、obj に有効なポインターが追加されました

あなたのリストはまだ空です。

于 2013-04-18T17:51:49.793 に答える
0

Java は厳密に値渡しです

あなたの混乱の多くは、

testList.add(obj1); // makes you think that you've added a pointer to the list

そして今、ポインタを次のように変更すると

obj1 = new MyClass(); // it would reflect at testList.get(0) as well.. NO!!

これは、Java が「参照渡し」の場合に当てはまりますが、testList.add(obj1);実際にtestList.add(null); は、値をコピーして配列の最初のインデックス位置を設定することにはならないため(この ArrayList を裏打ち) null、.

Java は、C や C++ がポインターを操作するようには機能しません。EDITによって物事を単純化することは、その設計目標の 1 つでした。いくつか例を挙げると、ポインター、それらの演算、多重継承、演算子のオーバーロードなどを削除します。

次のようにプログラムを変更すると、より明確になります。

MyClass obj1 = new MyClass("Object 1"); // modify the constructor to take an id
List<MyClass> testList = new ArrayList<MyClass>();
testList.add(obj1);
obj1 = new MyClass("Object 2");
System.out.println(testList.get(0).toString()); // implement toSting() to id MyClass

testList含まれて"Object 1"いません"Object 2"

于 2013-04-18T18:05:12.643 に答える