Java操作符易混淆点你解决了么?
创始人
2024-07-21 14:51:51
0

今天开始重新温习Java,翻了翻java编程思想,看到操作符那里有一些考试面试经常遇到的又容易出错的地方,在这记录一下。

1. 赋值操作:在对一个对象进行赋值操作时,我们所操作的是对对象的引用。比如使用c=d,将对象d赋给对象c,这时c所指向的正式d之前所指向的内存,这时如果改变c或者d其中任何一个的值,另外一个的值也会变。

下面举个例子说明:

Java代码

 

  1. class A{     
  2.     int a;     
  3. }     
  4.     
  5. public class Test{     
  6.     public static void main(String[] args){     
  7.         A c = new A();     
  8.         A d = new A();     
  9.         c.a = 10;     
  10.         d.a = 15;     
  11.     
  12.         c = d;     
  13.         System.out.println("c.a = " + c.a + ", d.a = " + d.a);     
  14.         d.a = 20;     
  15.         System.out.println("c.a = " + c.a + ", d.a = " + d.a);     
  16.     }     
  17. }  

 

输出结果为:

c.a = 15, d.a = 15

c.a = 20, d.a = 20

可见当d的值改变时,c的值也会跟着改变,这说明这两个对象指向同一块儿内存。

2. 方法调用中的别名问题,比如将对象a作为参数传递给函数f,并在函数f中对对象a进行修改,那么实际修改的是a对象本身,因为传递给f的是a的一个引用,它和a指向的是同一块内存。

Java代码

 

  1. class A{     
  2.     int item;     
  3. }     
  4.     
  5. public class Test{     
  6.     public static void main(String[] args){     
  7.         A a = new A();     
  8.         a.item = 10;     
  9.         f(a);     
  10.         System.out.println("a.item = " + a.item);     
  11.     }     
  12.     static void f(A obj){     
  13.         obj.item = 20;     
  14.     }     
  15. }    
复制代码

 

输出结果为:

a.item = 20

3. equals 和 ==

==就是用来比较对象的引用,也就是说它只在乎两个对象是不是指向同一块内存,如果是的话,就返回true,否则即使两个对象的值相等,它也返回false

equals()的默认行为也是比较引用,但是它在jdk的许多类中都被覆盖过了(这些类有java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)),覆盖后的结果为,只要两个对象的类型一致、值一致,就返回true,否则返回false。

举个例子:

Java代码

 

  1. class A{     
  2.     int item;     
  3. }     
  4.     
  5. public class Test{     
  6.     public static void main(String[] args){     
  7.         A a = new A();     
  8.         a.item = 10;     
  9.         A b = new A();     
  10.         b.item = 10;     
  11.              
  12.         f(a, b);     
  13.     
  14.         a = b;     
  15.         f(a, b);     
  16.     
  17.         String s1 = new String("test");     
  18.         String s2 = new String("test");     
  19.         if(s1 == s2)     
  20.             System.out.println("s1 == s2");     
  21.         else if(s1.equals(s2))     
  22.             System.out.println("s1 equals s2");     
  23.     }     
  24.     
  25.     static void f(A a, A b){     
  26.         if(a == b)     
  27.             System.out.println("a == b");     
  28.         else      
  29.             System.out.println("a != b");     
  30.     
  31.         if(a.equals(b))     
  32.             System.out.println("a equals b");     
  33.         else    
  34.             System.out.println("a is not equals b");     
  35.     }     
  36. }   
复制代码

 

输出结果为:

a != b

a is not equals b

a == b

a equals b

s1 equals s2

这充分说明了 == 和 equals都是比较对象的引用的,s1 equals s2说明了在String类里覆盖了equals方法,只要两个对象值一样,就返回true。

【编辑推荐】

  1. Scala讲座:函数、操作符及与Java的比较
  2. PHP操作符的种类概览
  3. 正则表达式操作符参考列表
  4. 标准查询操作符概述及剖析
  5. Scala的操作符:任何方法都可以是操作符

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...