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

2

这是为什么 testList 在这些代码之后的第一个节点仍然有“null”的解释

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步

MyClass obj1 = null;

此行为 MyClass 引用变量(引用值的位持有者)创建空间,但不创建实际的 Myclass 对象。

第2步

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

创建一个列表testList可以保存MyClass类型的对象

第 3 步

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

testList 第一个节点现在将引用 null 但不是 MyClass 对象。

第4步

obj1 = new MyClass();

在堆上创建一个新的 MyClass 对象并将新创建的 MyClass 对象分配给引用变量 obj1。

所以现在列表将如何更新它仍然持有一个 null 但不是 MyClass 对象。

所以现在如果你想让 testList 的第一个节点成为一个新的MyClass对象

然后在之后写这个孤独的代码obj1 = new MyClass();

testList.set(0, obj1);

所以现在之后的完整代码将是

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();

testList.set(0, obj1);

根据我的理解,这就是你的问题。

于 2013-04-18T17:56:53.400 回答
1
MyClass obj1 = null;

类型为obj1的引用变量不MyClass引用任何内容(NULL)。

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

我们声明了一个类型为testListList的引用变量,并将它分配给堆中一些新创建ArrayList的对象。

testList.add(obj1);

List testList的第一个元素被分配了与obj1当前持有的相同的引用,即。空值。

obj1 = new MyClass();

MyClass我们在堆中创建了一个新对象,并为obj1分配了它的引用。但是我们没有为List testList的第一个元素分配任何新的引用,它被分配了 NULL 引用,所以它仍然没有指向任何地方。

于 2013-04-18T17:53:40.697 回答
1

当您将对象添加到ArrayList对象时,对象不会被添加到,ArrayList但指向对象的指针将被添加。

因此,如果您执行以下操作:

Object obj1 = new Object() // [location: x1234]
list.add(obj1); // first index in list points to location x1234
obj1 = new Object(); // [location: x2345];

现在数组的指针仍然指向旧位置。

情况也是如此null。尽管您将链接更改obj1为新位置,但数组仍指向旧位置,即null.

于 2013-04-18T17:58:15.333 回答
0
  1. obj1 不指向任何东西,指针不存在
  2. 您创建一个新列表, testList 指向该列表
  3. 您什么都不添加到列表中,因为您的 obj1 点为空,因此不存在
  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); 复制值并将 Array 的第一个索引位置(支持此 ArrayList)设置为null.

Java 不像 C 和 C++ 使用指针那样工作。它的设计目标之一是通过EDIT简化事情:删除指针、它们的算术、多重继承、运算符重载等,仅举几例。

如果您按如下方式修改程序,则更清楚:

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"not "Object 2"

于 2013-04-18T18:05:12.643 回答