第3章:操作符

在最底層,java中的數據是通過使用操作符來操作的

  • 操作符優先級:先乘除後加減.
  • 賦值:Test類非常簡單,它的兩個實例t1和t2.當將t2賦值給t1的時候,接着又修改t1,因爲賦值操作的是一個對象的引用,所以修改t1的時候也改變了t2的值.這是由於t1和t2包含的是相同的引用,他們指向相同的對象(原本t1包含的對象的引用,是指向一個值爲9的對象.在對t1賦值的時候.這個引用被覆蓋,也就是丟失了;會被垃圾回收器自動清理) 這種特殊的現象通常稱爲”別名現象”,是java操作對象的一種基本方式.在這個例子中想要避免別名問題可以這麼寫t1.level=t2.level,這樣可以保持2個對象的獨立性,而不是將t1和t2綁定到相同的對象.
public class Test {
    int level;
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
        t1.level = 9;
        t2.level = 47;
        System.out.println(t1.level + "===" + t2.level);//9===47
        t1=t2;
        System.out.println(t1.level + "===" + t2.level);//47===47
        t1.level=27;
        System.out.println(t1.level + "===" + t2.level);//27===27
    }
}
  • 自動遞增和遞減:++a 前綴遞增表示操作符位於變量或者表達式的前面 與a++後綴遞增操作符位於變量或者表達式的後面.
    前綴遞增和遞減:會先執行運算,在生成值.
    後綴遞增和遞減:會先生成值,再執行運算.
public class Test {
    public static void main(String[] args) {
       int i=1;
        System.out.println(i);//1
        System.out.println(++i);//2
        System.out.println(i++);//2
        System.out.println(i);//3
        System.out.println(--i);//2
        System.out.println(i--);//2
        System.out.println(i);//1
    }
}
  • 關係操作符:
    關係操作符==和!=也適用於所有對象,但這兩個操作符比較的是對象的引用.
    public static void main(String[] args) {
     Integer n1= new Integer(47);
     Integer n2= new Integer(47);
        System.out.println(n1==n2);//false
        System.out.println(n1!=n2);//true
    }

如果想要比較兩個對象的實際內容是否相同,可以使用equals() 但這個方法不適用於基本類型,基本類型直接使用==或!=即可

    public static void main(String[] args) {
     Integer n1= new Integer(47);
     Integer n2= new Integer(47);
        System.out.println(n1.equals(n2));//true
    }

假設你創建了自己的類,就像下面的結果:事情變得令人費解結果又是false這是由於equals()默認行爲是比較引用.所以除非在自己的新類中覆蓋equals()方法,否則不可能表現出我們希望的行爲

public class Test {
    int i;
    public static void main(String[] args) {
        Test v1 = new Test();
        Test v2 = new Test();
        v1.i = v2.i = 10;
        System.out.println(v1.equals(v2));//false
    }
}

當覆蓋equals()後得到的結果是 true

public class Test {
    int i;

    public static void main(String[] args) {
        Test v1 = new Test();
        Test v2 = new Test();
        v1.i = v2.i = 10;
        System.out.println(v1.equals(v2));//true
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Test)) return false;

        Test test = (Test) o;

        return i == test.i;
    }
}
  • 邏輯運算符:
    當使用邏輯運算符的時候,我們會遇到一種短路現象.即一旦能夠準確無誤的確定整個表達式的值,就不會再計算餘下的表達式.因此整個表達式靠後的部分有可能不會被計算.

  • 直接常量:如果在程序中使用直接常量,編譯器可以準確的知道要生成什麼樣的類型,但有時候也是模棱兩可的.如果發生這種情況必須對編譯器加以指導,用與直接常量相關的某些字符來額外增加一些信息.後綴添加標識符L代表long,F代表float,D代表double.

  • 按位操作符:按位操作符用來操作整數,基本數據類型中的單個比特(bit)即二進制位.按位操作符會對兩個參數中對應的位執行布爾代數運算,並最終生成一個結果.
  • 類型轉換:在執行向下轉型(窄化轉換)的操作,也就是說將能容納更多信息的數據類型轉換成無法容納那麼多信息類型的時候就面臨丟失數據的危險.這時候最好進行顯式的轉換.在執行向上轉型(擴展轉換)則不必顯式轉換.
    在執行窄化轉化時,必須要注意截尾與舍入的問題.例如將92.7轉換成int變成92,因此將float或double轉換成int的時候,總是對該數字執行截尾,如果想要四捨五入.就需要使用java.lang.Math的round()發法.
    提升:如果對基本數據類型執行算數運算或按位運算,大家會發現,只要類型比int小(即char byte或short)那麼在運算之前,這些值都會自動轉換成int,這樣一來生成的結果就是int.如果將一個float和一個double值相乘,結果就是double;將一個int和一個long值相加結果就是long.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章