在最底層,Java中的數據是經過操做符來操做的。java
+
,-
,*
,*
,=
與其餘語言相似=
,==
,!=
是例外+
和+=
操做符,表示拼接操做,在進行拼接的操做會嘗試將非 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++ 也是相似,有一點比較特殊的是在 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-9
和a-f
0
前綴+0-8
l/L
表示long
類型f/F
表示float
類型d/D
表示double
類型1.39E-43
表示$1.39 \times e^{-43}$>>
符號擴展,>>>
0擴展boolean-exp ? value0 : value1get
+
和+=
+
和+=
表示「拼接」操做**類型轉換(cast
)**是指,在適當的時候,Java 會將一種數據類型自動轉換爲另外一種。string
顯式的類型轉換以下:編譯
int i = 200; long l = (long)i; int j = (int)l;
java.lang.Math.round()
一個表達式中出現的最大的數據類型決定了該表達式最終結果的數據類型,如 int 類型與 long 類型相加,獲得一個 long 類型。
因爲Java中全部基本數據類型的大小都是明確的,因此不須要sizeof。BTW,boolean 不是沒有明確嘛。
本文首發於Code & Fun