《 Java 編程思想》CH03 操作符 在最底層,Java中的數據是通過操作符來操作的。 操作符 ,` `, ,`=`與其他語言類似 幾乎所有的操作符只能操作“基本類似”,而 ,`== !=`是例外 String 類支持 和`+=`操作符,表示拼接操作,在進行拼接的操作會嘗試將非 String 的 ...
《 Java 編程思想》CH03 操作符
在最底層,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
函數來比較。
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
n1 == n2; // false
n1.equals(n2); // true
equals
預設是比較引用,所以在自己實現的類中需要覆蓋equals
方法才能進行語義上的比較
邏輯操作符
&&
,||
和!
操作只能用於布爾值,與C++不同,對一個非布爾值進行邏輯運算不會對該值強制轉換,會報編譯錯誤
Java中的邏輯操作符也有“短路”現象
直接常量
- 十六進位
0x/0X
首碼+0-9
和a-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 : value1
字元串操作符 +
和+=
- 字元串中操作符
+
和+=
表示“拼接”操作 - 如果一個表達式以字元串開頭,那麼其後續操作數都必須是字元串類型(不是則進行強制轉換)
類型轉換操作符
類型轉換(cast
)是指,在適當的時候,Java 會將一種數據類型自動轉換為另一種。
顯式的類型轉換如下:
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