今天开始重新温习Java,翻了翻java编程思想,看到操作符那里有一些考试面试经常遇到的又容易出错的地方,在这记录一下。
1. 赋值操作:在对一个对象进行赋值操作时,我们所操作的是对对象的引用。比如使用c=d,将对象d赋给对象c,这时c所指向的正式d之前所指向的内存,这时如果改变c或者d其中任何一个的值,另外一个的值也会变。
下面举个例子说明:
Java代码
- class A{
- int a;
- }
- public class Test{
- public static void main(String[] args){
- A c = new A();
- A d = new A();
- 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代码
- class A{
- int item;
- }
- public class Test{
- public static void main(String[] args){
- A a = new A();
- a.item = 10;
- f(a);
- System.out.println("a.item = " + a.item);
- }
- static void f(A obj){
- obj.item = 20;
- }
- }
输出结果为:
a.item = 20
3. equals 和 ==
==就是用来比较对象的引用,也就是说它只在乎两个对象是不是指向同一块内存,如果是的话,就返回true,否则即使两个对象的值相等,它也返回false
equals()的默认行为也是比较引用,但是它在jdk的许多类中都被覆盖过了(这些类有java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)),覆盖后的结果为,只要两个对象的类型一致、值一致,就返回true,否则返回false。
举个例子:
Java代码
- class A{
- int item;
- }
- public class Test{
- public static void main(String[] args){
- A a = new A();
- a.item = 10;
- A b = new A();
- b.item = 10;
- f(a, b);
- a = b;
- f(a, b);
- String s1 = new String("test");
- String s2 = new String("test");
- if(s1 == s2)
- System.out.println("s1 == s2");
- else if(s1.equals(s2))
- System.out.println("s1 equals s2");
- }
- static void f(A a, A b){
- if(a == b)
- System.out.println("a == b");
- else
- System.out.println("a != b");
- if(a.equals(b))
- System.out.println("a equals b");
- else
- System.out.println("a is not equals b");
- }
- }
输出结果为:
a != b
a is not equals b
a == b
a equals b
s1 equals s2
这充分说明了 == 和 equals都是比较对象的引用的,s1 equals s2说明了在String类里覆盖了equals方法,只要两个对象值一样,就返回true。
【编辑推荐】