《 Java 編程思想》CH03 操作符

《 Java 編程思想》CH03 操作符

在最底層,Java中的數(shù)據(jù)是通過操作符來操作的。

操作符

  • +,-,*,*,=與其他語言類似
  • 幾乎所有的操作符只能操作“基本類似”,而=,==,!=是例外
  • String 類支持++=操作符,表示拼接操作,在進(jìn)行拼接的操作會嘗試將非 String 的元素轉(zhuǎn)換為 String(調(diào)用tostring())
  • 賦值操作符=的左邊(左值)必須是一個明確的已命名的變量。

賦值

在為對象“賦值”時,其實質(zhì)是拷貝“引用”,需要注意“別名現(xiàn)象”

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

方法調(diào)用中的別名問題

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
    }
}

不管是那種別名問題,關(guān)鍵是要理解到拷貝的是引用,不是對象。

算數(shù)操作符 & 自增與自減 & 按位操作符

  • 整數(shù)除法不會四舍五入,而是直接舍去小數(shù)位
  • 其余與C++中的一樣

關(guān)系操作符

關(guān)系操作符與 C++ 也是類似,有一點比較特殊的是在 Java 中==!=可以用在對象上,其比較的是引用,而不是對象內(nèi)的值,如果要比較兩個對象是否相等(語義上),通常調(diào)用equals函數(shù)來比較。

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

equals默認(rèn)是比較引用,所以在自己實現(xiàn)的類中需要覆蓋equals方法才能進(jìn)行語義上的比較

邏輯操作符

&&,||!操作只能用于布爾值,與C++不同,對一個非布爾值進(jìn)行邏輯運(yùn)算不會對該值強(qiáng)制轉(zhuǎn)換,會報編譯錯誤

Java中的邏輯操作符也有“短路”現(xiàn)象

直接常量

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

移位操作符

  • 移位操作符只能用于處理整數(shù)類型
  • >>符號擴(kuò)展,>>>0擴(kuò)展
  • 對 char、byte、short 類型進(jìn)行移位運(yùn)算,在進(jìn)行移位之前會先轉(zhuǎn)回為 int

三元運(yùn)算符

boolean-exp ? value0 : value1

字符串操作符 ++=

  • 字符串中操作符 ++=表示“拼接”操作
  • 如果一個表達(dá)式以字符串開頭,那么其后續(xù)操作數(shù)都必須是字符串類型(不是則進(jìn)行強(qiáng)制轉(zhuǎn)換)

類型轉(zhuǎn)換操作符

類型轉(zhuǎn)換(cast)是指,在適當(dāng)?shù)臅r候,Java 會將一種數(shù)據(jù)類型自動轉(zhuǎn)換為另一種。

顯式的類型轉(zhuǎn)換如下:

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

類型轉(zhuǎn)換:

  • 窄式轉(zhuǎn)換,需要顯式指定(如 long 轉(zhuǎn) int)
  • 擴(kuò)展轉(zhuǎn)換,無需顯式指定(如 int 轉(zhuǎn) long)
  • Java允許任何基本類型之間的類型轉(zhuǎn)換,除了布爾值。
  • “類”數(shù)據(jù)類型不允許類型轉(zhuǎn)換

截尾和舍入

  • 當(dāng) float 或 double 轉(zhuǎn)向整型時,總是對數(shù)字進(jìn)行截尾
  • 如果需要舍入,可以調(diào)用java.lang.Math.round()

提升

一個表達(dá)式中出現(xiàn)的最大的數(shù)據(jù)類型決定了該表達(dá)式最終結(jié)果的數(shù)據(jù)類型,如 int 類型與 long 類型相加,得到一個 long 類型。

Java 沒有 sizeof

由于Java中所有基本數(shù)據(jù)類型的大小都是明確的,所以不需要sizeof。BTW,boolean 不是沒有明確嘛。

本文首發(fā)于Code & Fun

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一年又一年,字節(jié)跳動 Lark(飛書) 研發(fā)團(tuán)隊又雙叒叕開始招新生啦!【內(nèi)推碼】:GTPUVBA【內(nèi)推鏈接】:ht...
    盧卡斯嗶嗶嗶閱讀 371評論 0 1
  • Java byte code 的學(xué)習(xí)意義 為啥要學(xué)java bytecode,這就跟你問我已經(jīng)會python了為...
    shanggl閱讀 1,850評論 0 3
  • 第3章 操作符 在最底層,java的數(shù)據(jù)是通過使用操作符來操作的。 3.2 使用Java操作符 操作符作用于操作數(shù)...
    vernwang閱讀 737評論 0 49
  • 賦值 “=”,取右邊的值把它復(fù)制給左邊?;绢愋痛鎯α藢嶋H的數(shù)值,而并非指向一個對象的引用,所以在為其賦值時,是直...
    海生2018閱讀 222評論 0 0
  • 最近工作中被運(yùn)算效率問題所困擾,比如大數(shù)據(jù)排序或者去重,因此現(xiàn)在需要補(bǔ)習(xí)一下位移運(yùn)算。 首先講一下位移概念? 左位...
    等一夏_81f7閱讀 1,365評論 0 0

友情鏈接更多精彩內(nèi)容