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