13 變量類型 :運算時,補碼運算,運算器不知道符號位,自動溢出
long 64bit 9964L(l)
double 64bit 123.13D(d) 或e3
float 1123.f
double/0=Infinite或-Infinite
char unicode 16位
都是有符號的。
>>不認識符號位
>>>符號位不動
instanceof 對象或其子類的對象
break 可以帶標號,一次跳出多層循環;
強制類型轉換和自動類型轉換 ,
無論在C/C++還是在Java,強制類型轉換已經不是陌生的概念了。但是要想全面掌握Java中類型轉換的要點可不那麼簡單,本文將帶領大家一同瞭解有關Java類型轉換的所有要點。 數值類型的類型轉換 衆所周知,Java有兩種數據類型:基本數據類型與引用數據類型;Java又有兩種基本的類型轉換原則:拓寬轉換原則(widening conversion)與縮小轉換原則(narrowing conversion)。 byte short int long float double (long轉float會失真) 當目標類型的範圍比源類型的範圍大時遵循拓寬轉換原則,不必強制轉換。如: |
short s = b;
反之則遵循縮小轉換原則,即
當目標類型的範圍比源類型的範圍小時遵循縮小轉換原則,必須強制轉換。如:
short s = 10;
byte b = (byte)s;
需要注意的是拓寬轉換原則不丟失數據。如:
縮小轉換原則在超出目標類型的取值範圍時會導致數據丟失。如:
上例輸出結果爲:
轉換前:257
轉換後:1
字符類型與數值類型之間的轉換
基本數據類型char等同於一個無符號短整型,範圍從0x0000到0xFFFF。
從其它數值類型轉換到char類型時,必須進行強制轉換。如:
將char類型轉換成其它數值類型時,除byte、short必須強制轉換外,int long float double均不必強制轉換。如:
引用類型的類型轉換
引用類型的賦值常見於具有繼承關係的兩種類型的轉換。如下面的例子:
當目標類型與源類型存在父子關係時,不必強制轉換。
上例是一個典型的多態。但如果要從父類引用轉換成子類引用,即
當源類型與目標類型存在父子關係時,必須進行強制轉換。如:
當然,如果子類引用指向的是一個父類對象,轉換時會拋出ClassCastException異常。(真實的父對象不能轉化爲子對象)
進一步,如果要從一個引用類型轉換成不相關的另一個引用類型,即
當源類型與目標類型不存在父子關係時,轉換無法進行,編譯時會出現錯誤。
數值類型與包裝類之間的轉換
JDK1.5之後引入了自動裝箱的概念。也就是說
將一個基本數據類型轉換到對應的引用類型時,不必強制轉換。如:
int i = 10;
Integer iObj = i;反之亦然。即
將一個基本數據類型的引用類型轉換到基本數據類型時,不必強制轉換。
Integer iObj = new Integer(10);
int i = iObj;//運行時可能異常,因爲實際是i=iObj.value(),iObj爲null時,會異常。
表達式中的類型提升原則
在算術運算和位運算中,數值類型的數據按以下原則進行類型提升:
byte、short和char型自動轉成int型;如:
如果有一個操作數是long型,則整個表達式的結果用long型表示;如:
位運算不能操作float及double類型,因此在算術運算中
如果有一個操作數是float型,則整個表達式的結果用float型表示;如:
如果有一個操作數是double型,則整個表達式的結果用double型表示。如:
特殊的類型提升
Java表達式中有一種特殊的表達式,? 表達式。? 表達式是一個特殊的賦值表達式,它會按照算術運算中的類型提升原則將 : 兩端的操作數提升至統一的類型。如:
byte b = 10;
short s = 20;
int i = (b == 10) ? b : s;
需要指出的是
如果 : 兩端有一個操作數是引用類型,則整個表達式的結果用Object型表示。
int i = 10;
String str = "Hello";
Object obj = (i == 10) ? i : str; // 在這裏變量i進行了自動裝箱操作