《 Java 編程思想》CH03 操做符

《 Java 編程思想》CH03 操做符

在最底層,Java中的數據是經過操做符來操做的。java

操做符

  • +,-,*,*=與其餘語言相似
  • 幾乎全部的操做符只能操做「基本相似」,而===!=是例外
  • String 類支持++=操做符,表示拼接操做,在進行拼接的操做會嘗試將非 String 的元素轉換爲 String(調用tostring())
  • 賦值操做符=的左邊(左值)必須是一個明確的已命名的變量。

賦值

在爲對象「賦值」時,其實質是拷貝「引用」,須要注意「別名現象」編程

package com.company.ch03;

class Tank {
    int level;
}

public class Assignment {
    public static void main(String[] args) {
        Tank tank1 = new Tank();
        Tank tank2 = new Tank();
        tank1.level = 12;
        tank2.level = 13;
        System.out.println("tank1 = " + tank1.level);
        System.out.println("tank2 = " + tank2.level);

        tank1 = tank2;
        tank1.level++;
        System.out.println("tank1 = " + tank1.level);
        System.out.println("tank2 = " + tank2.level);
    }
}
//tank1 = 12
//tank2 = 13
//tank1 = 14
//tank2 = 14

方法調用中的別名問題

package com.company.ch03;

class Letter {
    char c;
}

public class PassObject {
    static void f(Letter y) {
        y.c = 'z';
    }

    public static void main(String[] args) {
        Letter x = new Letter();
        x.c = 'a';
        System.out.println("x.c = " + x.c); // a
        f(x);
        System.out.println("x.c = " + x.c); // z
    }
}

無論是那種別名問題,關鍵是要理解到拷貝的是引用,不是對象。函數

算數操做符 & 自增與自減 & 按位操做符

  • 整數除法不會四捨五入,而是直接捨去小數位
  • 其他與C++中的同樣

關係操做符

關係操做符與 C++ 也是相似,有一點比較特殊的是在 Java 中==!=能夠用在對象上,其比較的是引用,而不是對象內的值,若是要比較兩個對象是否相等(語義上),一般調用equals函數來比較。code

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
n1 == n2; // false
n1.equals(n2); // true

equals默認是比較引用,因此在本身實現的類中須要覆蓋equals方法才能進行語義上的比較對象

邏輯操做符

&&,||!操做只能用於布爾值,與C++不一樣,對一個非布爾值進行邏輯運算不會對該值強制轉換,會報編譯錯誤blog

Java中的邏輯操做符也有「短路」現象字符串

直接常量

  • 十六進制0x/0X前綴+0-9a-f
  • 八進制0前綴+0-8
  • 後綴l/L表示long類型
  • 後綴f/F表示float類型
  • 後綴d/D表示double類型
  • 指數記數法:1.39E-43表示$1.39 \times e^{-43}$

移位操做符

  • 移位操做符只能用於處理整數類型
  • >>符號擴展,>>>0擴展
  • 對 char、byte、short 類型進行移位運算,在進行移位以前會先轉回爲 int

三元運算符

boolean-exp ? value0 : value1get

字符串操做符 ++=

  • 字符串中操做符 ++=表示「拼接」操做
  • 若是一個表達式以字符串開頭,那麼其後續操做數都必須是字符串類型(不是則進行強制轉換)

類型轉換操做符

**類型轉換(cast)**是指,在適當的時候,Java 會將一種數據類型自動轉換爲另外一種。string

顯式的類型轉換以下:編譯

int i = 200;
long l = (long)i;
int j = (int)l;

類型轉換:

  • 窄式轉換,須要顯式指定(如 long 轉 int)
  • 擴輾轉換,無需顯式指定(如 int 轉 long)
  • Java容許任何基本類型之間的類型轉換,除了布爾值。
  • 「類」數據類型不容許類型轉換

截尾和舍入

  • 當 float 或 double 轉向整型時,老是對數字進行截尾
  • 若是須要舍入,能夠調用java.lang.Math.round()

提高

一個表達式中出現的最大的數據類型決定了該表達式最終結果的數據類型,如 int 類型與 long 類型相加,獲得一個 long 類型。

Java 沒有 sizeof

因爲Java中全部基本數據類型的大小都是明確的,因此不須要sizeof。BTW,boolean 不是沒有明確嘛。

本文首發於Code & Fun

相關文章
相關標籤/搜索