我遇到了一个情况,我很困惑。请帮帮我。 假设我有这样的代码。
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
以下是我理解的步骤(可能不正确......):
抱歉,我是编程新手... 任何帮助表示赞赏!
答案 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)
您的清单仍然是空的。
答案 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"
。