Java对象引用是如何工作的?
我跑向一个情境,我很困惑。请帮帮我。 假设我有这样的代码Java对象引用是如何工作的?,java,object,pointers,reference,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
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
MyClass obj1=null;
List testList=new ArrayList();
testList.add(obj1)//在这行代码之后,testList在第一个节点处将有一个“null”
obj1=新的MyClass()//在这行代码之后,testList仍然有一个“null”
//在第一个节点。。。
//我想要的是testList的第一个节点将成为一个新节点
//MyClass对象
以下是我理解的步骤(可能不正确…):
MyClass obj1 = null;
MyClass obj1 = null;
类型为MyClass
的名为obj1的引用变量未引用任何内容(NULL)
List
testList的第一个元素被分配了obj1当前持有的相同参考,即。空
obj1 = new MyClass();
我们在heap中创建了一个新的MyClass
对象,并将其引用分配给obj1。但是我们还没有为List
testList的第一个元素分配任何新的引用,它被分配了空引用,所以它仍然没有指向任何地方
类型为MyClass
的名为obj1的引用变量未引用任何内容(NULL)
List
testList的第一个元素被分配了obj1当前持有的相同参考,即。空
obj1 = new MyClass();
我们在heap中创建了一个新的
MyClass
对象,并将其引用分配给obj1。但是我们还没有给列表的第一个元素分配任何新的引用,它被分配了NULL引用,所以它仍然不指向任何地方。下面解释为什么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;
List<MyClass> testList = new ArrayList<MyClass>();
此行为MyClass引用变量(位保持器)创建空间
,但不创建实际的Myclass对象
步骤2
MyClass obj1 = null;
List<MyClass> testList = new ArrayList<MyClass>();
testList第一个节点现在将引用null,但不是MyClass对象
步骤4
obj1 = new MyClass();
在堆上创建新的MyClass对象,并将新创建的MyClass对象分配给引用变量obj1
那么现在列表将如何更新呢?它仍然保存一个null,但不是一个MyClass对象
现在,如果您想使testList的第一个节点成为一个新的MyClass对象
然后在obj1=newmyclass()之后编写这段代码代码>
那么接下来的完整代码是
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);
MyClass obj1=null;
List testList=new ArrayList();
testList.add(obj1)//在这行代码之后,testList在第一个节点处将有一个“null”
obj1=新的MyClass();
testList.set(0,obj1);
据我所知,这都是关于您的问题。以下是解释为什么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;
List<MyClass> testList = new ArrayList<MyClass>();
此行为MyClass引用变量(位保持器)创建空间
,但不创建实际的Myclass对象
步骤2
MyClass obj1 = null;
List<MyClass> testList = new ArrayList<MyClass>();
testList第一个节点现在将引用null,但不是MyClass对象
步骤4
obj1 = new MyClass();
在堆上创建新的MyClass对象,并将新创建的MyClass对象分配给引用变量obj1
那么现在列表将如何更新呢?它仍然保存一个null,但不是一个MyClass对象
现在,如果您想使testList的第一个节点成为一个新的MyClass对象
然后在obj1=newmyclass()之后编写这段代码代码>
那么接下来的完整代码是
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);
MyClass obj1=null;
List testList=new ArrayList();
testList.add(obj1)//在这行代码之后,testList在第一个节点处将有一个“null”
obj1=新的MyClass();
testList.set(0,obj1);
据我所知,这都与您的问题有关。当您将对象添加到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
的链接更改为新位置,但当您将对象添加到ArrayList
时,数组仍然指向null的旧位置。对象不会添加到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
的链接更改为新位置,但阵列仍然是poi