大名鼎鼎的《Thinking in java》Java8版本發(fā)布了,趕緊趁熱乎精讀一遍,這個(gè)文集是我自己的學(xué)習(xí)筆記,想要系統(tǒng)學(xué)習(xí)的同學(xué)參考價(jià)值不大,適合查漏補(bǔ)缺。
因?yàn)檫@本書前期知識很基礎(chǔ),這里集中記錄自己認(rèn)為比較容易忘的小知識點(diǎn),供自己日后翻閱。
Java更具可移植性的原因
- Java 確定了每種基本類型的內(nèi)存占用大小。 這些大小不會像其他一些語言那樣隨著機(jī)器環(huán)境的變化而變化。
高精度數(shù)值 BigInteger和BigDecimal
- 沒有對應(yīng)的基本類型
- 不能用運(yùn)算符進(jìn)行運(yùn)算,需要內(nèi)部方法
- 犧牲速度換精度
數(shù)組
- 數(shù)組直接賦值給另一個(gè)數(shù)組,也只是復(fù)制一個(gè)引用
- 創(chuàng)建一個(gè)對象數(shù)組,實(shí)際上是引用數(shù)組
可變參數(shù)列表
- 當(dāng)你指定參數(shù)時(shí),編譯器實(shí)際上會為你填充數(shù)組
- 既能傳遞不定量參數(shù),也能傳遞一個(gè)數(shù)組
- 如果列表中沒有任何元素,那么轉(zhuǎn)變?yōu)榇笮?0 的數(shù)組
/**
* 可變參數(shù)列表
*/
class A {}
public class Code1 {
public static void print(Object... args) {
for(Object a: args) {
System.out.print(a + " ");
}
System.out.println();
}
public static void main(String[] args) {
// 單獨(dú)的不定量參數(shù)可以
print(1, 2, 3);
print(new A(), new A());
print("aaa");
// 一個(gè)數(shù)組也可以
print((Object[]) new Integer[] {1,2,3});
// 也可以什么都沒有
print();
// 基本類型可以和自動裝箱混用
print(1,new Integer(2),3);
}
}
- 這種不能重載
public static void print1(Integer[] a) {
System.out.println("int[]");
}
public static void print1(Integer... a) {
System.out.println("int[]");
}
- 重載方法中建議不要使用可變參數(shù)列表,容易出錯(cuò)
final
修飾數(shù)據(jù)
-
數(shù)據(jù)為常量,在編譯時(shí)確定,但不一定知道確定的值
private final int i4 = rand.nextInt(20); 必須在定義常量的時(shí)候進(jìn)行賦值,若是空白 final,必須在構(gòu)造方法中為 final 數(shù)據(jù)賦值
修飾對象時(shí),只是為引用常量,即引用不能被修改,對象本身的內(nèi)部數(shù)據(jù)可以被修改
修飾數(shù)組,和修飾對象是一樣的情況
修飾參數(shù)
- 在方法中不能改變參數(shù)指向的對象或基本變量
修飾方法
- final修飾方法,該方法不能被子類重寫(Override)
- 早期為了提高效率,但現(xiàn)代JVM可以進(jìn)行優(yōu)化,故禁止這種方式
- 所有private方法都隱式為final方法,因?yàn)樗衟rivate方法都不能被重寫,故private final方法不會添加更多的意義
修飾類
- 不能被繼承,目的是因?yàn)樵擃惖脑O(shè)計(jì)就是永遠(yuǎn)不需要改動,或者是出于安全考慮不希望它有子類。
final忠告
- 程序員為了不讓其他人重寫這個(gè)方法,會用final修飾方法,但有時(shí)程序員沒有考慮到很全面,這就限制了方法被重寫(在有需求的情況下)
- 舉個(gè)例子,java1.0/1,1 中的 Vector 中有很多方法是final的,這就大大限制了Vector的靈活性,這是java早期的缺陷,之后Vector被ArrayList代替。同時(shí),Vector中的很多方法都是既同步,有時(shí)final的,這就導(dǎo)致同步的開銷抹除了final 帶來的好處