天天看點

[Java學習筆記] Java核心技術 卷1 第三章 基本程式設計結構第3章 基本程式設計結構

前兩章:概述&設計環境 

第3章 基本程式設計結構

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方法。

其他:多元數組,不規則數組。

轉載于:https://www.cnblogs.com/djq0/p/5580778.html