《 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-9和a-f - 八進(jìn)制
0前綴+0-8 - 后綴
l/L表示long類型 - 后綴
f/F表示float類型 - 后綴
d/D表示double類型 - 指數(shù)記數(shù)法:
1.39E-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