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对象
以下是我理解的步骤(可能不正确…):

  • obj1存储不指向任何内容的指针
  • testList存储指向保存“new ArrayList()的内存的指针
  • testList在其集合中添加obj1的指针
  • obj1存储指向“new MyClass()的指针
  • 因此,testList中的obj1应该自动指向“new MyClass()
  • 对不起,我是编程新手。。。 感谢您的帮助

  • obj1未指向任何内容,指针不存在
  • 创建一个新列表时,testList指向该列表
  • 您不向列表中添加任何内容,因为您的obj1点为空,因此不存在
  • 创建新对象时,obj现在有一个valide指针
  • 您的列表仍然是空的

    MyClass obj1 = null;
    
  • obj1未指向任何内容,指针不存在
  • 创建一个新列表时,testList指向该列表
  • 您不向列表中添加任何内容,因为您的obj1点为空,因此不存在
  • 创建新对象时,obj现在有一个valide指针
  • 您的列表仍然是空的

    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