目錄:html
Java編程思想 第四版 Bruce Eckel著 陳昊鵬譯java
源代碼資源位於 www.MindView.net程序員
如經常使用的String s = 「abc」;就至關於String s = new String(「abc」);前半句建立引用,後半句建立對象,=將引用指向了對象。編程
在Java中,一個引用能夠指向0個或者1個對象,一個對象能夠有0個或者1個或者多個引用。如在上面的代碼中加入s2=s;就至關於String對象」abc」增長了一個引用s2。數組
熟悉了上面的說明,作下這個測試吧,s1~6的相等關係是(內存等,非值等)?緩存
String s1 = "abc";
String s2 = s1;
String s3 = "abc";
String s4 = new String("abc");
String s5 = s4;
String s6 = new String("abc");
s1 = s2 = s3 != s4架構
s4 = s5 != s6app
計算機的數據存儲從快到慢分爲寄存器、堆棧、堆、常量存儲、非RAM存儲。引用位於堆棧中,而對象位於堆中。dom
基本類型 | 大小 | 最小值 | 最大值 | 包裝器類型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16 bits | Unicode 0 | Unicode 2^16 -1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15 -1 | Short |
int | 32 bits | -2^31 | +2^31 -1 | Integer |
long | 64 bits | -2^63 | +2^63 -1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | - | Void |
轉換關係:eclipse
byte也叫字節,簡稱B。1B = 8 bit。bit也叫比特,是一個二進制單位。1KB = 1024B。
高精度的整型BigInteger和浮點型BigDecimal不屬於基本類型,詳情參考JDK。
Java解決了程序員同時須要維護文檔和代碼兩份無關聯文件的繁瑣。Java能夠將代碼中的註釋生成爲HTML格式。
Java終端採用命令 javadoc xxx.java便可。對於中文doc採用utf-8編碼,即 javadoc xxx.java -encoding UTF-8 -charset UTF-8
Java中的註釋有兩種( /*java*/ 和 //java ),可是javadoc能夠導出的是下列方式的註釋:
/** This is a annotation */
/**
* This is an annotation
* @author Aran
* @param args
*/
註釋要有註釋的規範,java的註釋主要有類註釋、域註釋和方法註釋,分別出如今類、域(變量定義)和方法定義以前。此外還有一些約定俗成的標籤,如@param,@author等等,在此不作贅述。
eclipse也能夠對整個project導出doc,而且能夠本身編寫doclets自定義javadoc的導出規則。這些自行參考網上文獻,再次不作贅述。
ps. 移位操做符在本書p49頁,使用較少,在此不作贅述。
java中的類型轉換分爲兩種:
窄化轉換,通常而言須要顯時表示。從long型、float型、double型轉換爲int,從int型轉換爲char、short、byte都是窄化。須要 (新類型)value 來表示。
擴輾轉換通常默認進行,爲了規範,建議顯時標註。
窄化轉換的截尾和舍入:
默認的窄化轉換,即從float轉int是直接執行截尾,把小數點後面數字直接去除。
若是想要四捨五入,則須要使用java.lang.Math中的round()方法。
擴輾轉換的提高:
一個計算式中同時出現好幾種類型,則會把計算結果提高爲最大類型。
包含if-else、while、do-while、for、for each、return、break和switch語句。
不一樣於逗號分隔符(經常使用於分割函數參數),這裏的逗號操做符for語句的控制表達式中的初始化和步進控制部分。
如示例:
for (int i = 1, j = i + 10; i < 5 && j < 30; i++, j = j * 2) {
System.out.println("i = "+i+" j = "+j);
}
ForEach語句是一種更加簡潔的for語句,經常使用於數組、容器和Iterable對象。
ForEach語法能夠沒必要建立int變量去對由訪問項構成的序列進行計數,ForEach將自動產生每一項。
語法的默認表達式爲:for(類型 x : 數組/容器){ x… }
以給float數組賦值和顯示爲例:
Random rand = new Random();
float[] f = new float[10];
for (float x : f)
{
x = rand.nextFloat();
System.out.println(x);
}
以給String對象迭代顯示爲例:
for(char x : "Happy Spring Festival".toCharArray())
{
System.out.print(x+".");
}
這裏使用了String類中的toCharArray()函數,把String類轉換成char數組。
Return
return會致使當前方法退出並返回那個值。若是一個方法聲明並不是返回void,那麼必須確保每一條代碼路徑都返回一個值。
Break和Continue
前者強行退出循環,不執行循環中剩餘的語句。後者則只是中止執行當前的迭代,退回循環起始處並開始下一次迭代。
goto
儘管java中保留了goto的功能,但並無goto關鍵字。採用break、continue+標籤的方法,能夠實現goto的功能。
標籤是後面跟有冒號的標識符,相似:
label1:
先上結論:
java 中的標籤後面必須緊跟循環語句,不然會被忽略掉從而在continue和break語句中沒法識別。
經過代碼來加深理解(參考P71-72頁代碼):
public static void main(String[] args) {
int i = 0;
outer:
for (; true;) {
System.out.println("Enter outer-for");
inner:
for (; i < 10; i++) {
System.out.println("Enter inner-for");
System.out.println("i = " + i);
if (i == 1) {
System.out.println("continue");
continue;
}
if (i == 2) {
System.out.println("break");
i++;// 不然i沒法自增
break;
}
if (i == 3) {
System.out.println("continue inner");
continue inner;
}
if(i == 4){
System.out.println("break inner");
i++;// 不然i沒法自增
break inner;
}
if(i == 5){
System.out.println("continue outer");
i++;// 不然i沒法自增
continue outer;
}
if(i == 6){
System.out.println("break outer");
break outer;//直接退出
}
}
}
}
出現的結果是:
Enter outer-for
Enter inner-for
i = 0
Enter inner-for
i = 1
continue
Enter inner-for
i = 2
break
Enter outer-for
Enter inner-for
i = 3
continue inner
Enter inner-for
i = 4
break inner
Enter outer-for
Enter inner-for
i = 5
continue outer
Enter outer-for
Enter inner-for
i = 6
break outer
xxxxxxxxxx1 1
值得注意的是,break和continue outer的操做會致使內層循環不執行++,這個要理清楚。
標準的switch範式以下:
switch(integral-selector){
case integral-value1 : statement; break;
case integral-value2 : statement; break;
default: statement; break;
}
使用switch語句須要注意一下幾點:
下面的例子(由P74-75,4.8改編)判斷a-z哪些是元音哪些是輔音:
public static void main(String[] args) {
for (int i = 0; i < 26; i++) {
System.out.print((char)('a' + i) + ":");
switch ('a' + i) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
System.out.println("vowel");
break;
case 'y':
case 'w':
System.out.println("sometimes vowel");
break;
default:
System.out.println("consonant");
}
}
}
利用了case下沒有break就依次順序執行的原理。
Java中構造器採用和類相同的名字。
構造器不會返回任何東西(沒有返回值)。
java對沒有自定義構造器的類提供默認構造器。若是自定義了任何一個構造器,則該類再也不具備默認構造器。
Java經過每一個相同函數名的獨一無二的參數類型列表來區分不一樣的重載方法。(參數順序的不一樣也能夠)
不一樣的參數數據類型能夠做爲重載的方法,而數據類型又存在類型轉換的問題。方法重載時的類型專函遵循如下規則:
this關鍵字只能在方法內部使用,表示對」調用方法的那個對象」的引用。若是要在方法內部調用同一個類的另外一個方法,則沒有必要使用this。
在類中函數一般經過返回this來返回當前對象的引用。
this關鍵字還能夠當作構造器來使用。可是在一個方法中只能指代一個構造器。見下面代碼:
public class My0504 {
My0504(int i) {
System.out.println(i);
}
My0504(String s) {
System.out.println(s);
}
My0504(int i, String s){
this(i);//正確,至關於調用My0504(int i)
this(s);//錯誤,此時this已經指代My0504(int i)
}
}
static方法中不能使用this,函數內仍是函數參數都不行。事實上,static方法中也只能直接調用static方法。
類型 | 未初始化時的默認值 |
---|---|
boolean | false |
char | (char值爲0,顯示爲空白) |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
引用 | null |
上述狀況說明,在類建立的過程,不管開發者有沒有指定,類內的成員變量都會進行初始化。若是用戶指定初始化,那麼須要注意初始化的順序問題:
public class My0506 {
int i = f();//正確
int k = j;//錯誤,向前引用
int f(){
return 11;
g();//正確
}
void g(){
System.out.println("hello");
}
int j =11;
}
能夠看到,函數能夠不分順序的引用,可是成員變量的引用要注意定義的順序。
上面討論了默認初始化、指定初始化,下面討論構造器初始化。
public class Counter{
int i;
Counter(){
i = 7;
}
}
在上述類中i首先被初始化爲0,再被置爲7。
構造器初始化要特別注意初始化順序的問題。簡而言之,就是類會優先執行默認初始化或者指定初始化,而後再執行構造器初始化。定義的前後順序並不影響該初始化順序。