容易被忽略的JAVA赋值操作

炸一看,觉得赋值操作没什么可说的,无非就是:使用操作符“=”,表示 “把右边的值复制给左边”,右边的值可以是任何常数、变量或者表达式(只要它能生成一个值就行)

但是在JAVA中,赋值的操作并不紧紧表示值的复制,单纯的这样认为,会掉入赋 值操作的陷阱,值得注意!

 

一、值复制

      对基本数据类型的赋值是值的复制。基本类型存储了实际的数值,而不是指向一个对象的引用,所以在为其赋值的时候,是直接将内容复制给左边的变量;例如,对 基本数据类型使用a = b,就是将b的值复制给a,如果接着又修改了a,而b的值不会受这个修改的影响。这是大多数情况下我们所期望的。


二、引用复制

      但在对对象“赋值”的时候,情况却发生变化,对对象赋值实际上是对对象的引用的复制;对一个对象进行操作时,我们真正操作的是对对象的引用。所以如果“将 一个对象赋值给另一个对象”,实际是将对象的“引用”复制到另一个对象,如果赋值后其中一个对象的属性发生变化,那么另外那个对象也会受到这种变化的影 响;引用Thinking in java中的例子:

 

Java代码 <embed height="15" width="14" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" quality="high" flashvars="clipboard=class%20Tank%20%7B%0A%20%20%20%20int%20level%3B%0A%7D%0A%0A%0Apublic%20class%20Assignment%20%7B%0A%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20%20%20%20%20Tank%20t1%20%3D%20new%20Tank()%3B%0A%20%20%20%20%20%20%20%20Tank%20t2%20%3D%20new%20Tank()%3B%0A%0A%20%20%20%20%20%20%20%20t1.level%20%3D%209%3B%0A%20%20%20%20%20%20%20%20t2.level%20%3D%2047%3B%0A%0A%20%20%20%20%20%20%20%20System.out.println(%221%3A%20t1.level%3A%20%22%20%2B%20t1.level%20%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2C%20t2.level%3A%20%22%20%2B%20t2.level)%3B%0A%0A%20%20%20%20%20%20%20%20t1%20%3D%20t2%3B%0A%0A%20%20%20%20%20%20%20%20System.out.println(%222%3A%20t1.level%3A%20%22%20%2B%20t1.level%20%2B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2C%20t2.level%3A%20%22%20%2B%20t2.level)%3B%0A%0A%20%20%20%20%20%20%20%20t1.level%20%3D%2022%3B%0A%0A%20%20%20%20%20%20%20%20System.out.println(%223%3A%20t1.level%3A%20%22%20%2B%20t1.level%20%2B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2C%20t2.level%3A%20%22%20%2B%20t2.level)%3B%0A%20%20%20%20%7D%0A%7D%20%20%2F*%20Output%3A%0A1%3A%20t1.level%3A%209%2C%20t2.level%3A%2047%0A2%3A%20t1.level%3A%2047%2C%20t2.level%3A%2047%0A3%3A%20t1.level%3A%2022%2C%20t2.level%3A%2022%0A*%2F%2F%2F%3A~" src="http://gls308.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf">
  1. class  Tank {  
  2.     int  level;  
  3. }  
  4.   
  5.   
  6. public   class  Assignment {  
  7.     public   static   void  main(String[] args) {  
  8.         Tank t1 = new  Tank();  
  9.         Tank t2 = new  Tank();  
  10.   
  11.         t1.level = 9 ;  
  12.         t2.level = 47 ;  
  13.   
  14.         System.out.println("1: t1.level: "  + t1.level +  
  15.                 ", t2.level: "  + t2.level);  
  16.   
  17.         t1 = t2;  
  18.   
  19.         System.out.println("2: t1.level: "  + t1.level +   
  20.                 ", t2.level: "  + t2.level);  
  21.   
  22.         t1.level = 22 ;  
  23.   
  24.         System.out.println("3: t1.level: "  + t1.level +   
  25.                 ", t2.level: "  + t2.level);  
  26.     }  
  27. }  /* Output:  
  28. 1: t1.level: 9, t2.level: 47  
  29. 2: t1.level: 47, t2.level: 47  
  30. 3: t1.level: 22, t2.level: 22  
  31. */ //:~  
class Tank {     int level; }   public class Assignment {     public static void main(String[] args) {         Tank t1 = new Tank();         Tank t2 = new Tank();          t1.level = 9;         t2.level = 47;          System.out.println("1: t1.level: " + t1.level +                 ", t2.level: " + t2.level);          t1 = t2;          System.out.println("2: t1.level: " + t1.level +                  ", t2.level: " + t2.level);          t1.level = 22;          System.out.println("3: t1.level: " + t1.level +                  ", t2.level: " + t2.level);     } }  /* Output: 1: t1.level: 9, t2.level: 47 2: t1.level: 47, t2.level: 47 3: t1.level: 22, t2.level: 22 *///:~

 

从输出可看出,由于赋值操作的是一个对象的引用,所以修改t1的同时,也改变了 t2,这是由于t1和t2包含的是相同的引用,指向一个相同的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值