请考虑以下示例。
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;
}
}
无法理解两种情况之间的差异,因为两种情况似乎都是相同的。 有人可以解释一下......?
答案 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
(然后将其分配给两个不同的变量,但它仍然只是一个对象实例)。