Java Object引用如何工作?

时间:2013-04-18 17:37:14

标签: java object pointers reference

我遇到了一个情况,我很困惑。请帮帮我。 假设我有这样的代码。

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()”
  6. 抱歉,我是编程新手... 任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:1)

MyClass obj1 = null;

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

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

我们声明一个名为 testList 的引用变量List,并将其分配给堆中新创建的ArrayList对象。

testList.add(obj1);

List testList 的第一个元素被分配了相同的引用, obj1 当前持有该引用。 NULL。

obj1 = new MyClass();

我们在堆中创建了一个新的MyClass对象,并为其指定了 obj1 。但是我们没有为List testList 的第一个元素分配任何新的引用,该第一个元素被赋予NULL引用,因此它仍然无处可寻。

答案 1 :(得分:1)

以下是为什么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);

这完全取决于我的理解。

答案 2 :(得分: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的旧位置。

答案 3 :(得分:0)

  1. obj1指向什么,指针不存在
  2. 您创建了一个新列表,testList指向该列表
  3. 你没有在列表中添加任何内容,因为obj1的点因此而不存在
  4. 你的创建新对象,obj现在有一个valide指针
  5. 您的清单仍然是空的。

答案 4 :(得分: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"而不是"Object 2"