前兩章:概述&設計環境
基本概念在Java中的實現方式。包括以下內容:
概覽。
注釋。
數據類型。
變量。
運算符。
字符串。
輸入輸出。
控制流程。
大數值。
數組。
大小寫敏感。
訪問修飾符:程序其他部分對這段代碼的訪問級別。
類是構建所有java應用程序和applet的構建塊。Java應用程序的全部內容必須放置在類中。
類命名規范:大寫字母開頭。多個單詞首字母均大寫的駱駝命名法CamelCase。
源代碼的文件名必須與公共類的名字相同,並用.java作為擴展名。
Java虛擬機規范 http://docs.oracle.com/javase/specs/jvms/se7/html
Java中所有函數都屬於某個類的方法,標准術語稱為方法而不是函數。所以main方法也必須有個外殼類。Main方法必須是靜態的。
普通的// 單行注釋 , /* */ 多行注釋 多行注釋不能嵌套。
以/**開頭以 */結束可以自動生成文檔的。
強類型語言,意味著必須為每個變量聲明一種類型。Java共有8個基本類型,其中有4種整形、2種浮點類型、1種用於表示Unicode編碼的字符單元的字符類型char和1種用於表示真值的boolean類型。
注釋:Java有一個能表示任意精度的算術包,通常稱為“大數值”,但它並不是一種新的Java類型,而是一個Java對象。
long 8 int 4 short 2 byte 1
通常使用int,更大數量用long,byte和short用於特定應用場合如底層文件處理或需要控制占用存儲空間量的大數組。
Java中整型范圍與運行Java代碼的機器無關(C/C++有關)。
長整型:後綴L 十六進制數值:前綴0x 八進制數值:前綴0(容易混淆少用)
從Java7開始 0b前綴表示二進制數,可以為數字字面量加下劃線如1_000_000表示100w,編譯器會去除下劃線。
double 8 float 4
精度方面double是float的兩倍,有人稱之為雙精度數值。
大部分應用程序使用double類型,很多情況下float的精度很難滿足要求。如需快速處理單精度數據或存儲大量數據時可用float。
float:後綴F double:無後綴或後綴D
JDK5.0中 可用十六進制數表示浮點數,如0.125可表示為0x1.0p-3,使用p表示指數而不是e。尾數采用十六進制,指數采用十進制,指數的基數是2不是10.
浮點數計算遵循IEEE754規范。特殊浮點數值:正無窮大、負無窮大、NaN(not a number)
檢查一個特定值是否等於Double.Nan 不能用 x== Double.NaN 而是 Double.isNan(x)
浮點數不適用於禁止出現捨入誤差的金融計算中。可用BigDecimal類。
用於表示單個字符,通常用來表示字符常量。在Java中char類型用UTF-16編碼描述一個代碼單元。
最好不要在程序中使用char類型,除非確實需要對UTF-16代碼單元進行操作。
Unicode打破了傳統字符編碼方法的限制:一個是對於任意給定的代碼值,不同的編碼方法下可能對應不同的字母;二是采用大字符集的語言其編碼長度有可能不同。
編碼單元可以表示為十六進制值,范圍從\u0000到\uffff
代碼點:code point是指與一個編碼表中的某個字符對應的代碼值。在Unicode標准中,代碼點采用十六進制書寫,並加上前綴U+,Unicode的代碼點可以分成17個代碼級別code plane。第一個代碼級別稱為基本的多語言級別,代碼點從U+0000到U+FFFF,其中包括了經典的Unicode代碼;其余的16個附加級別,代碼點從U+10000到U+10FFFF,包括一些輔助字符。
UTF-16編碼采用不同長度的編碼表示所有Unicode代碼點。在基本的多語言級別中,每個字符用16位表示,通常被稱為代碼單元;而輔助字符采用一對連續的代碼單元進行編碼。這樣構成的編碼值一定落入基本的多語言級別中空閒的2048字節內,通常稱為替代區域。這樣設計可以從中迅速知道一個代碼單元是一個字符的編碼還是一個輔助字符的第一或第二部分。(有具體的編碼算法)
\n Unicode編碼轉義。特殊轉義 \b 退格 \t 制表 \n 換行 \r 回車 \’ \” \\
false true 判斷邏輯條件。整型值和布爾值之間不可相互轉換。
C++中數值或指針可替代boolean值,0相當於false,非0相當於true,Java中不可以。
Java中每個變量屬於一種類型。聲明變量時,類型+變量名;
變量名必須以字母開頭、並且由字母或數字組成。字母包括常規的a~z A~Z _ $ 等還包括在某種語言中代表字母的任何Unicode字符。同樣數字包括0~9 以及在某種語言中代表數字的任何Unicode字符。但+ 這樣的字符不可以,空格不可以。變量名所有字符都是有意義的,大小寫敏感,長度無限制。
盡管$是一個合法的Java字符,但不要在自己的代碼中使用這個字符。只用在Java編譯器或其他工具生成的名字中。
不能將變量命名為Java保留字,可以在一行中聲明多個變量,但逐行聲明每一個變量可提供程序可讀性。
如果要知道哪些Unicode字符屬於Java中的字母,可以使用Character類的isJavaIdentifierStart和isJavaIdentifierPart方法進行檢查。
取名:有時很難給變量取一個好名字,於是很多程序員將變量名命名為類型名,如Box box ;還有一些喜歡在變量前加前綴 a如 Box aBox;
變量聲明後,在使用之前必須進行顯示初始化。聲明或初始化的位置可隨意,但必須在使用之前。良好的習慣是盡可能靠近變量第一次使用的地方。
使用final指示常量,只能被賦值一次,一旦賦值後就不能再更改了。習慣上常量名使用全大寫。
使用static final設置一個類常量, 可以在一個類的多個方法中使用。類常量定義與main方法的外部。因此在同一個類的其他方法中可以使用這個常量。而且如果被聲明為public,其他類的方法也可使用這個常量。
const是Java保留的關鍵字,但並沒有使用。
+ - * / 加減乘除。 % 求余。
除法時,兩個操作數都是整數結果也是整數,否則表示浮點除法。所以5/2這樣想得到2.5的結果必須寫成 5.0/2 或 5/2.0 或 5.0/2.0
整數被0除產生一個異常,浮點數被0出將會得到無窮大或NaN結果。
簡化的二元運算符 如x+=4; 等價於 x = x+4; 通常將運算符放在賦值號的左側,如 *= 或%=
浮點數的跨平台運算,很難保證結果的同一性。在默認情況下,虛擬機設計者允許將中間結果采用擴展的精度,同時對於使用strictfp關鍵字標記的方法必須使用嚴格的浮點計算來產生理想的結果。如果對一個類標記為strictfp,這個類中所有方法都要使用嚴格的浮點計算。
實際的計算方式取決於Intel處理器,默認情況下,中間結果允許使用擴展指數,不允許使用擴展的尾數。因此兩種方式的區別僅在於采用默認的方式不會產生溢出,而采用嚴格的計算可能有產生溢出。
大多數程序來說,浮點溢出不屬於大問題。
n++與++n 首先這種運算符只能應用於變量,常量無法增加或減少。前綴先變化後使用,後綴先使用後變化。
建議不要在其他表達式的內部使用++ , 這樣編寫的代碼容易令人困惑並產生煩人的bug。
== 是否相等 != 是否不相等 其他 <= < > >=
&& 邏輯與 || 邏輯或 ! 邏輯非
&&與|| 采用 短路 方式求值,如果第一個操作數可確定第二個就不必計算了。
三元操作符 ?: 與C++C#一樣,滿足條件返回?:之間的表達式 否則返回:之後的表達式 x<y?x:y 返回小的
& 與 | 或 ^ 異或 ~ 非 << >> 移位操作 >>>用0填充高位 沒有<<<運算符
在處理整型數值時,可以直接對組成整型數值的各個位進行操作。意味著可以使用屏蔽技術獲得整數中的各個位。
如 int i = (n & 0b1000) / 0b1000; 如果二進制表示的n右數第4位為1,那麼i=1,否則i=0;
通過運用2的冪次方的&運算可以將其他位屏蔽。
&和|運算符應用於布爾值,得到的結果也是布爾值,與&&與||很像,但不按短路方式計算。
Math類包含了一些數學函數。平方根、次冪、三角函數、指數函數及其反函數,常量π和e
導入包 import static java.lang.Math.*; 之後,可直接使用方法及常量而不用加 Math.
Math類為了達到最快性能,所有方法使用計算機浮點單元中的例程。如果得到一個完全可預測的結果比運行速度更重要的話應使用 StrictMath類。
無丟失情況:整型按字節由少到多;char轉int;int轉double;
丟失情況:int轉float;long轉float;long轉double;
兩個數值進行二元操作時,先要將兩個操作數轉換為同一種類型,然後再進行計算:
有一個double,另一個會轉換成double
否則,如果其中一個是float,另一個會轉換為float
否則,如果其中一個是long,另一個會轉換為long
否則,都被轉為int。
有時會進行一些丟失信息的強制類型轉換。 (類型)變量
對浮點數強制轉換int直接截斷小數部分,如果四捨五入則需要Math.round方法。
將一個數值從一種類型強制轉換為另一種類型,而又超出了目標類型的表示范圍,結果就會截斷成一個完全不同的值。
不要在boolean類型與任何數值類型直接進行強制轉換,可以防止發生錯誤。如果真的需要轉換為數值,可使用條件表達式 b?1:0 這樣
優先級表,如果不使用圓括號,就按照運算符優先級次序進行計算,同一級別按照結合性順序計算。
優先級
運算符
結合性
1
[].()(方法調用)
→
2
! ~ ++ -- +(一元) –(一元) ()(強制類型轉換) new
←
3
* / % (二元)
→
4
+ - (二元)
→
5
<< >> >>>
→
6
< <= >= > instanceof
→
7
== !=
→
8
&
→
9
^
→
10
|
→
11
&&
→
12
||
→
13
?:
←
14
= += -= *= /= %= &= |= ^= <<= >>= >>>=
←
枚舉類型包含有限個命名的值,
例如 enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}; Size s= Size.MEDIUM;
這樣Size類型的變量只能存儲這個類型聲明中給定的某個枚舉值或null值。
從概念上講,Java字符串就是Unicode字符序列。Java沒有內置的字符串類型,而是在標准Java類庫中提供了一個預定義類,叫做String。每個用雙引號括起來的字符串都是String類的一個實例。
String類沒有提供用於修改字符串的方法,即不能修改字符串中的字符,所以在Java文檔中將String類對象稱為不可變字符串,如同數字3永遠是3,給字符串變量賦新值也只是讓它引用了另外一個字符串,並沒有改變原來的字符串,當原來的字符串不再使用後,Java會自動進行垃圾回收。
記:因為String不是基本數據類型,而是一個類。
Java字符串由char序列組成,而char數據類型是一個采用UTF-16編碼表示的Unicode代碼點的代碼單元。大多數的常用Unicode字符使用一個代碼單元就可以表示,而輔助字符需要一對代碼單元表。
Java中的代碼單元和代碼點從0開始計數。
length方法將返回采用UTF-16編碼表示的給定字符串所需要的代碼單元數量。
codePointCount(0,str)方法可以得到實際的代碼點長度。
charAt(n) 返回位置n的代碼單元
offsetByCodePoints(0,i) codePointAt(i) 第i個代碼點
子串: substring
拼接: 使用 + 號拼接字符串 ,+ 會將非字符串值轉換成字符串。 如把一個數字轉為字符串,則可 ""+i
相等: equals equalsIgnoreCase 一定不能用==判斷,這樣只會比較內存地址是否相等。
空串: "" 是長度為0的字符串,是Java對象 通過str.length()==0 或str.equals("")判斷
null: String變量還可存放null,表示目前沒有任何對象與該變量關聯。 str==null
檢測: 同時檢測空串和null時 if(str !=null && str.length()!=0) 順序不能變,基於短路方式判斷。
其他API
有時需要由較短的字符串構建字符串,采用字符串連接的方式效率較低,每次連接字符串都會構建一個新的String對象,此時可使用StringBuilder類。
StringBuilder builder = new StringBuilder();
builder.append("123"); builder.toString();
關於類的使用說明可參考API,不再詳述
控制台應用的輸入輸出
塊作用域:花括號括起來的部分。在作用域內的變量不可重名。 可以嵌套
僅列出示例語法
if(...){...}
if(...){...} else{...}
if(...){...} else if(...){...} ... else{...}
可以嵌套。
while(...){...}
do{...} while(...)
for(int i=1;i<-10;i++){...}
for(int i : array){...} foreach循環,針對數組等
設計者認為應當使用foreach in 這樣的關鍵字,但這種循環是後來添加去的,並且沒人打算廢除已有的同名方法或變量的舊代碼,所以使用了現在的語法
C#中的 foreach(int i in array){...}就是上述關鍵字的表現。
switch(choice){case 1:... break; case 2:... break; default:... break;}
Java設計者保留了goto關鍵字,但並未使用。
break:常規不帶標簽的可直接中斷距離break最近的外層循環。
帶標簽的break語句,可用於跳出多重循環,
label: 循環體 ,當跳出時使用break label;即可
事實上label可用於任何語句塊。
continue:結束當前循環進入下一次循環。帶標簽的continue語句將跳到與標簽匹配的循環首部。
基本的整數和浮點數精度不足夠時,可使用java.math包中的兩個類:BigInteger 和BigDecimal,可處理包含任意你孤獨數字序列的數值。前者任意精度的整數,後者任意精度的浮點數。
不能使用基本算術運算符,要使用類中的方法來計算如add代替+
int[] array = new int[100];
元素個數:array.length ,數組創建後就不能改變大小了。數組長度可以為0,與null不同。
數字數組所有元素初始化為0,boolean為false,對象類為null
Arrays.toString(array);返回array數組的所有元素,放在括號內用逗號隔開,如 [2,3,4]
C++中 int array[] 中括號的位置不同。C#中相同。
創建一個數組並初始化
int[] array={2,3,4,5,6};
new int[] {2,3,4,5,6}; 匿名數組
若用賦值使一個數組賦值為另一個,則是把左邊的數組指向了右邊的數組地址,兩者引用的是同一塊內容。
若要保持兩個的獨立性只是使值相同,則使用copyTo方法。
其他:多元數組,不規則數組。