操作符
别名问题
先来看段代码,猜猜最后输出的是什么:
class Test{
int t;
}
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t1 = new Test();
Test t2 = new Test();
t1.t=1;
t2.t=2;
t1=t2;
System.out.println(t1.t+"-"+t2.t);
t1.t=3;
System.out.println(t1.t+"-"+t2.t);
}
}
最后输出的是
2-2
3-3
结果可能会和你的想象不一样,这就是别名问题,因为t1,t2都是引用,开始它俩指向不同的对象,但是用t2给t1赋值的操作,就是让t1引用指向t2的对象,所以在改t1的对象的时候,实际上也是改的t2的对象。
再看下面的代码:
class Test{
int t;
}
public class A {
static void f(Test t){
t.t=10;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t1 = new Test();
t1.t=1;
System.out.println(t1.t);
f(t1);
System.out.println(t1.t);
}
}
这个运行结果可能也会和你想的不一样,可能会觉得只是传了个t1的副本,但是实际上是传了引用。
关系操作符
关系操作符 == 和!=同样适用于对象。但是对于第一次接触的人来说,可能会有些迷惑,下面看段程序:
class Test{
int t;
public Test(int a){
t=a;
}
}
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer t1 = new Integer(1);
Integer t2 = new Integer(1);
System.out.println(t1==t2);
System.out.println(t1!=t2);
System.out.println(t1.equals(t2));
Test t3 = new Test(1);
Test t4 = new Test(1);
System.out.println(t3==t4);
System.out.println(t3!=t4);
System.out.println(t3.equals(t4));
}
}
猜一猜输出的是什么?
false
true
true
false
true
false
造成这个结果的原因很简单,就是==比较的是引用,只有两个引用指向同一对象才会为true,但是为什么equals不一样呢?因为equals在默认情况下也是比较两个引用,是否指向同一对象,但是integer对equals方法进行了覆盖,重写了这个方法。
对于逻辑运算符,与C,C++不同,只能用于布尔值。
另外,对于逻辑运算有一点要注意,在多个逻辑表达式时,“&&”连接的,只要前面有一个false则后面的不执行,“||”连接的,只要前面有一个true则后面不执行。