Java操作符易混淆点你解决了么?

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

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

  下面举个例子说明:

  Java代码

  

    classA{ inta; } publicclassTest{ publicstaticvoidmain(String[]args){ Ac=newA(); Ad=newA(); c.a=10; d.a=15; c=d; System.out.println(“c.a=”+c.a+”,d.a=”+d.a); d.a=20; System.out.println(“c.a=”+c.a+”,d.a=”+d.a); } }

  输出结果为:

  c.a = 15, d.a = 15

  c.a = 20, d.a = 20

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

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

  Java代码

  

    classA{ intitem; } publicclassTest{ publicstaticvoidmain(String[]args){ Aa=newA(); em=10; f(a); System.out.println(“em=”+em); } staticvoidf(Aobj){ em=20; } }

  输出结果为:

  em = 20

  3. equals 和 ==

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

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

  举个例子:

  Java代码

  

    classA{ intitem; } publicclassTest{ publicstaticvoidmain(String[]args){ Aa=newA(); em=10; Ab=newA(); em=10; f(a,b); a=b; f(a,b); Strings1=newString(“test”); Strings2=newString(“test”); if(s1==s2) System.out.println(“s1==s2”); elseif(s1.equals(s2)) System.out.println(“s1equalss2”); } staticvoidf(Aa,Ab){ if(a==b) System.out.println(“a==b”); else System.out.println(“a!=b”); if(a.equals(b)) System.out.println(“aequalsb”); else System.out.println(“aisnotequalsb”); } }

  输出结果为:

  a != b

  a is not equals b

  a == b

  a equals b

  s1 equals s2

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

旅游不在乎终点,而是在意途中的人和事还有那些美好的记忆和景色。

Java操作符易混淆点你解决了么?

相关文章:

你感兴趣的文章:

标签云: