JAVA程式設計思想學習筆記(三)操作符
阿新 • • 發佈:2018-12-21
操作符
別名問題
先來看段程式碼,猜猜最後輸出的是什麼:
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則後面不執行。