在两种不同的情况下与对象引用混淆

时间:2016-02-15 04:01:15

标签: java object reference linked-list

请考虑以下示例。

    Employee emp = new Employee();

    emp.name="John";
    emp.id=3;

    Employee emp2=emp;

    System.out.println(emp.toString());    // prints 3 John
    System.out.println(emp2.toString());   // prints 3 john

    emp2.name="Cena";
    emp2.id=9;

    System.out.println(emp.toString());     //prints 9 Cena
    System.out.println(emp2.toString());    //prints 9 Cena here whatever changes made to emp2 are refletced in emp object too

现在示例2(用于在链表的尾部插入节点):

 static Node Insert(Node head,int data) {   
     Node head1=new Node();   // New node for insertion
     head1.data=data;
     head1.next=null;

     if(head==null) {        
         head=head1;     
         return head;
     }
     else {
         Node tmp=head;   // here both tmp and head needs to be same always as in the previous exaample
         while(tmp.next!=null) {
             tmp=tmp.next;// but head and tmp are not equal after an iteration why...?
         }
         tmp.next=head1;        
         return head;
     }    
 }

无法理解两种情况之间的差异,因为两种情况似乎都是相同的。 有人可以解释一下......?

2 个答案:

答案 0 :(得分:3)

所以,当你说emp2=emp时,你基本上已经说过"我希望emp2指向与emp"相同的内存块。所以,他们都指向同一个记忆。如果你更改了那个内存,他们都会获取同一个块,并且都反映了这个变化。

第二个例子做了同样的事情。但是,您正在更新第二个引用而不更新另一个引用。当您说tmp = tmp.next时,您将其更新为指向新的内存位置。但是,head没有获得此类更新。因此,它们将是不同的价值观。

所以,想想这样:

obj1 --> memory0
obj2 --> memory0

更新其中一个的将更新。但...

obj3 --> memory1
obj4 --> memory1
obj3 --> memory.next (memory2)

对象3现在指向memory2,但对象4仍指向内存1.

答案 1 :(得分:0)

关键区别在于,在Node示例中,您有两个Nodes,在Employee示例中只有一个。

计算有多少new次来电。

Node head1=new Node();  // new instance

Node示例中,您从方法外部收到一个实例,并通过调用new再创建一个实例。

Employee emp2=emp;     // additional name for existing instance

Employee示例中,您创建一个Employee(然后将其分配给两个不同的变量,但它仍然只是一个对象实例)。