標識符語法
1)java中定義標識符格式以字母,數字,下划線,$符合組成,不能以數字開頭,且不能為
java中的關鍵字。
2)標識符意義要明確,不要亂起
3)標識符區分大小寫例如 z和Z是不同的兩個標識符
4)java常用關鍵字
Java中的關鍵字
abstract |
assert |
boolean |
break |
byte |
case |
catch |
char |
class |
continue |
const |
default |
do |
double |
else |
extends |
enum |
final |
finally |
float |
for |
goto |
if |
implements |
import |
instanceof |
int |
interface |
long |
native |
new |
package |
private |
protected |
public |
return |
short |
static |
synchronized |
super |
strictfp |
this |
throw |
throws |
transient |
try |
void |
volatile |
while |
數據類型分類和轉換
四類 |
八種 |
字節數 |
數據表示范圍 |
整型 |
byte |
1 |
-128~127 |
|
short |
2 |
-32768~32767 |
|
int |
4 |
-2147483648~2147483648 |
|
long |
8 |
-263~263-1 |
浮點型 |
float |
4 |
-3.403E38~3.403E38 |
|
double |
8 |
-1.798E308~1.798E308 |
字符型 |
char |
2 |
表示一個字符,如('a','A','0','家') |
布爾型 |
boolean |
1 |
只有兩個值true與false |
1)布爾
基本數據類型中,布爾類型boolean占有一個字節,由於其本身所代碼的特殊含義,boolean類型與其他基本類型不能進行類型的轉換(既不能進行自動類型的提升,也不能強制類型轉換), 否則,將編譯出錯。
2)基本數據類型中數值類型的自動類型提升
圖中依次表示了各數值類型的字節數和相應的取值范圍。在Java中,整數類型(byte/short/int/long)中,對於未聲明數據類型的整形,其默認類型為int型。在浮點類型(float/double)中,對於未聲明數據類型的浮點型,默認為double型。
1 public class TestCast { 2 5 3 6 public static void main(String[] args) { 4 7 byte a = 1000; // 編譯出錯 5 8 float b = 1.5; // 編譯出錯 6 9 byte c = 3; // 編譯正確 7 10 } 8 11 9 12 }
jvm在編譯過程中,對於默認為int類型的數值時,當賦給一個比int型數值范圍小的數值類型變量(在此統一稱為數值類型k,k可以是byte/char/short類型),會進行判斷,如果此int型數值超過數值類型k,那么會直接編譯出錯。因為你將一個超過了范圍的數值賦給類型為k的變量,k裝不下,你又沒有進行強制類型轉換,當然報錯了。但是如果此int型數值尚在數值類型k范圍內,jvm會自定進行一次隱式類型轉換,將此int型數值轉換成類型k。如圖中的虛線箭頭。這一點有點特別,需要稍微注意下。
在其他情況下,當將一個數值范圍小的類型賦給一個數值范圍大的數值型變量,jvm在編譯過程中俊將此數值的類型進行了自動提升
自動類型轉換
表示范圍小的數據類型轉換成范圍大的數據類型,這種方式稱為自動類型轉換
自動類型轉換格式:
范圍大的數據類型 變量 = 范圍小的數據類型值
強制類型轉換格式
范圍小的數據類型 變量 = (范圍小的數據類型) 范圍大的數據類型值;
public class TestCast { public static void main(String[] args) { byte p = 3; // 編譯正確:int到byte編譯過程中發生隱式類型轉換 int a = 3; byte b = a; // 編譯出錯 byte c = (byte) a; // 編譯正確 float d = (float) 4.0; } }
區別在於前者3是直接量,編譯期間可以直接進行判定,后者a為一變量,需要到運行期間才能確定,也就是說,編譯期間為以防萬一,當然不可能編譯通過了。此時,需要進行強制類型轉換。
3)其他情況
public class TestCast { public static void main(String[] args) { long a = 10000000000; //編譯出錯 long b = 10000000000L; //編譯正確 int c = 1000; long d = c; float e = 1.5F; double f = e; } }
如上:定義long類型的a變量時,將編譯出錯,原因在於10000000000默認是int類型,同時int類型的數值范圍是-2^31 ~ 2^31-1,因此,10000000000已經超過此范圍內的最大值,故而其自身已經編譯出錯,更談不上賦值給long型變量a了。
此時,若想正確賦值,改變10000000000自身默認的類型即可,直接改成10000000000L即可將其自身類型定義為long型。此時再賦值編譯正確。
將值為1000的int型變量c賦值給long型變量d,按照上文所述,此時直接發生了自動類型提升, 編譯正確。同理,將e賦給f編譯正確。
接下來,還有一個地方需要注意的是:char型其本身是unsigned型,同時具有兩個字節,其數值范圍是0 ~ 2^16-1,因為,這直接導致byte型不能自動類型提升到char,char和short直接也不會發生自動類型提升(因為負數的問題),同時,byte當然可以直接提升到short型。