1. 程式人生 > >JAVA程式設計思想學習筆記(三)操作符

JAVA程式設計思想學習筆記(三)操作符

操作符

別名問題

先來看段程式碼,猜猜最後輸出的是什麼:

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則後面不執行。