《Java基礎知識總結》系列是對自己學習Java歷程中知識的一個總結,也是為自己找工作前知識的回顧,為找工作奠定基礎。
1、Identifiers:標識符
①Names of class,method and variable:用於類名、方法名、變量名
②Begin with character,"_" or "$":標識符不能以數字開頭
③Case sensitive:大小寫敏感(區分大小寫)
④No length limitation:長度無限制
⑤標識符不能是Java關鍵字,漢字也可以做標識符,但是不建議使用(使用漢字涉及到編碼問題,跨平台時回出現問題)。
⑥String是Java的一個類,類名是標識符,所以String可以做標識符。
⑦There is no sizeof operator.Java中沒有sizeof運算符,所以sizeof可以作為標識符
⑧關鍵字、保留字(const、goto、true、false、null)不能用作標識符。
1 public class Identifiers { 2 public static void main(String[] args) { 3 String $abc="abc1"; 4 String _abc="abc2"; 5 //編譯錯誤,標識符不能以數字開頭 6 //String 8abc="abc3"; 7 String 中國="China"; 8 String String="wanghao"; 9 int Integer=22; 10 //Java中沒有sizeof運算符,所以sizeof可以作為標識符 11 String sizeof="sizeof"; 12 System.out.println(String);//wanghao 13 System.out.println(Integer);//22 14 } 15 }
2、Keywords:關鍵字
The goto and const keyword are not used in the Java programming.
const 保留關鍵字(留兒不用)。const是從C++繼承而來的,但是Java並不使用const這個關鍵字,由於JVM是由C++編寫的,因此,雖然Java並不使用const這個關鍵字,但卻要保留下來。和const一樣goto也是保留關鍵字!
關鍵字全部用小寫表示(53個)
Strictly speaking,the literals true,false,and null are not keywords but literals;however,the distinction is academic.
true,false,and null是保留字但不是關鍵字,只是3個值,不能用來做關鍵字。
3、Primitive data types:基本數據類型
Java強數據類型只能先聲明后使用。
boolean Boolean literals indicating true or false
char Stores one 16-bit unicode character
char 同時具備字符和整數的特征。
byte 8-bit integer
short 16-bit integer
int 32-bit integer
long 64-bit integer
Integer Data Types-byte,short,int and long
float 32-bit floating-point number
double 64-bit floating-point number
在范圍內的常數可以自動轉換類型,但是變量就不一定了。
小————》大 自動轉換
大————》小 強制類型轉化
Byte相當於截取了最后8位,前面的全部舍去
1 public class Demo { 2 public static void main(String[] args) { 3 int i1 = 5; //語句1 Right 4 5 byte b1=5; //語句2 Right 6 byte b2=3; //語句3 Right 7 //byte b3=128; //語句4 Wrong 128超出了byte的范圍 8 byte b3=(byte)128; //語句5 Right 9 //byte的取值范圍:(-128,127) 10 byte b4=127; 11 byte b5=-128; 12 //byte b6=-129; //-129超出了byte的范圍 13 14 long l1=5; //語句6 Right 15 long l2=5L; //語句7 Right 16 //b1=i1; //語句8 Wrong i1不能轉換成b1 17 b1=(byte)i1; //語句9 18 l1=i1; //語句10 Right 19 //i1=123L; //語句11 Wrong 20 i1=(int)123L; //語句12 21 22 //b1=b1+b2; //語句13 Wrong b1+b2變成int 23 b1=(byte)(b1+b2); //語句14 24 } 25 }
程序分析:
① 整形數據默(byte,short,int and long)認類型是int型,因此語句1正確
② 占用位數小的類型(簡稱“小類型”)向占用位數多的類型(簡稱“大類型”)可以自動轉換,相反,大類型到小類型則要通過強制類型轉換。
如:語句6是由int---->long(自動轉換)。
語句11是由long---->int(不能進行轉換,提示“可能損失精度”的錯誤),必須通過強制類型轉換,改正后為語句12。
③ 語句2和語句3是由int---->byte(自動轉換),這又是怎么回事呢?
int可自動轉換為byte和short而無需強制類型轉換,這是因為byte和short表示的范圍較小,所有小於int的整型運算,先轉換為int類型,再參與運算。例如:15和20都在byte范圍內但是15*20卻超出了byte的表示范圍,則要存放在int類型變量里面。
④ 既然int可以自動轉換為byte和short而不需強制類型轉換,那么為什么語句8會出錯,需要改成語句9這樣的強制類型轉換呢?
語句8表面上是int---->byte但是i1是一個int型的變量,它表示(-65535----65535)范圍的整數,不能確定它的值,因此需要強制類型轉換。語句4中128超出了byte的表示范圍,因此不能賦值給byte變量b3需要進行強制類型轉換,如語句5。
⑤ 強制類型轉換的實質是什么呢?
例如語句5執行的結果是:-128,這是為什么呢?
這正是強制類型轉換后的結果。int類型是32-bit,128的二進制表示形式為:00000000,00000000,00000000,10000000。Byte類型是8-bit,要把int類型強制轉換成byte類型,則只截取其后8-bit,把前24-bit去除掉。因此byte b3=(byte)128;執行后的結果的二進制表示形式為:10000000,對應的整數即為-128。
⑥ 所有小於Int的整型運算,先轉成int 再運算,因此語句13出現錯誤,需要進行強制類型轉換,如語句14。
1 public class Float { 2 public static void main(String[] args) { 3 double d1=123.0; 4 double d2=123.0F; 5 //編譯錯誤 Default data type is double 6 //float f1=123.0; 7 //需要強制類型轉換 8 float f1=(float)123.0; 9 10 //int和long可以自動轉換為float和double 11 float f2=123; 12 float f3=123L; 13 double d3=123; 14 double d4=123L; 15 } 16 }
Float Point Data Type-float and double
① Default data type is double
② A float data is 32-bit long
③ A double data is 64-bit long
④ A float data ends with 'f' or 'F'
⑤ A double data can end with 'd' or 'D'
在計算機領域對於float和double只能表示他們的近似值。因為小數可以無限,但是計算機表示的精度是有限的。
⑥ int和long可以自動轉換為float和double
Java變量類型:
① 基本類型:boolean,byte,char,shot,int,long,float,double
② 引用類型:所有類、接口、數組、枚舉、標注
Recommended Naming Rules
① Class names begin with uppercase character
② Interface names begin with uppercase character
③ Method names begin with lowercase character
④ Variable names begin with lowercase character
⑤ Constant variable names are in uppercase character,不同單詞間用“_” 隔開,例如:USER_NAME。
⑥ Package names are in lowercase character
規范我們可以違背,但是我們提倡遵守,養成一種良好的習慣!
4、Operators
Assignment operators
= += -= %= *= /= <<= >>= >>>= &= ^= |=
1 public class ByteDemo { 2 public static void main(String[] args) { 3 byte b1=2; 4 byte b2=3; 5 b1=(byte)(b1+b2); // 語句1 加法,轉int 6 b1+=b2; //語句2 賦值,不轉int 7 } 8 }
b1+=b2;是否和語句b1=b1+b2完全等價?
答案是否定的,上面程序中的語句1和語句2給出了證明。語句1中byte類型參數與運算時要先轉換為int型,因此要進行強制類型轉換。而語句2中,自動進行類型轉換。(我的理解:我們可以把“b11+=b2;”看做是對“b1=(byte)(b1+b2);”的優化!)
Comparison operators
> >= < <= instanceof
Equality operators
= = !=
Arithmetic operators
+ - * / %
Shift operators
>> << >>>
Bitwise operators
& | ^(按位異或) ~(按位取反)
Logic operators
&& (邏輯與) & || (邏輯或) | !(邏輯非)
&&和&都是邏輯與,它們之間的區別:&&是短路邏輯與,有短路的效果,效率更高。
||和|都是邏輯或,它們之間的區別:||是短路邏輯或,有短路的效果,效率更高。
Conditional operators
? :
Other operators
++ --
1 public class Test5 { 2 public static void main(String [] args){ 3 int i=2; 4 System.out.println(i++); //2 5 System.out.println(i); //3 6 int a=i++ + ++i; //3+5=8 7 System.out.println(a); 8 System.out.println(i); //5 9 for(int j=0;j<1000;j++){ 10 i=i++; 11 } 12 System.out.println(i); //5 13 } 14 }
程序分析:
為什么經過1000次循環后,i=i++;的結果仍然是5?
(老師講解)++的運算符優先級高於=(賦值)運算符,i++的運算結果為5,進入寄存器,這時寄存器中存放的值為5。然后i的值變為6,繼續執行賦值語句,賦值時,把寄存器中的值賦5值給i,因此i的值是5和6之間來回切換的!
(我的理解)++的運算符優先級高於=(賦值)運算符,因此這個表達式的執行順序如下:①運算i++這個表達式的結果為5 。----> ②i的值自加1(i++先參與運算,再自加1),即i的值變為6。----> ③將i++這個表達式的值,即第①部的結果賦值給變量i。("="表達式是將右邊表達式的值賦值與左邊的變量,因此是將5賦於i,而不是將6賦於i)。整個循環過程i的值在5和6之間來回切換。