Head first Java 讀書筆記 -----構造器與垃圾收集器
1.棧與堆
1.記憶體中有兩種區域,物件的生存空間--堆(heap),以及方法呼叫和區域性變數的生存空間--棧(stack)。
2.當你呼叫一個方法時,該方法會放在呼叫棧的棧頂。實際被堆上棧的是堆疊塊,堆疊塊帶有方法的狀態,包括執行到哪一行程式以及所有的區域性變數。
3.例項變數是宣告在類中方法之外的地方,它存在於所屬的物件之中,故它存在於堆上。
4.區域性變數宣告在方法或方法的引數上,所有的區域性變數都存在於棧上相應的堆疊塊中。
5.物件引用變數與primitive資料型別變數都放在棧上。(?)
6.物件本身一定在堆上。
7.若在堆上新建一個物件,該物件所需要的空間是存放該物件所有例項物件的空間。
2.建立物件以及構造器
1.建構函式帶有你在初始化物件時會執行的程式程式碼。也就是新建一個物件時就會被執行。就算你沒有自己寫建構函式,編譯器也會幫你自動生成一個建構函式。
2.建構函式必須與類同名且沒有返回型別。
3.建構函式的主要目的是用來初始化物件的狀態,也就是對例項變數賦值。
4.Java會有不是建構函式但與類同名的方法。建構函式與該種方法的區分方法是建構函式沒有返回型別。
5.一個類可以擁有不同的建構函式(利用overload的方法)。只要建立不同輸入引數的建構函式即可。
6.編譯器只要在你完全沒有設定建構函式時才會自動幫你生成一個建構函式。
7.建構函式可以是公有的、私有的或不指定的。
8.在建立某個物件時,物件會取得所有例項變數所需的空間,這裡面也包括從父類繼承下來的例項變數。
9.建構函式在執行的時候,第一件事就是去執行它父類的建構函式。
10.在子類建構函式內可以手動或者自動呼叫父類的建構函式。手動呼叫的方法是super(parameter);,若沒有呼叫手動呼叫,則編譯器會自動幫我們加上super();,但是編譯器幫我們加上的一定會是沒有引數的建構函式。
11.父類的部分必須在子類建立完成之前就完整成型,所以對父類建構函式的呼叫必須是子類建構函式的第一個語句。
12.如果父類的建構函式一定需要有引數,而子類的建構函式沒有手動呼叫父類的建構函式,則該子類的初始化不能完成。即必須要手動呼叫父類的建構函式並傳入引數,子類才能構造完成。
13.可以使用this()來從某個建構函式中呼叫該類另一個建構函式。但是this()只能用在建構函式之中,且必須是第一行語句。super與this不能同時使用。
3.物件的生命週期
1.區域性變數的作用範圍僅限於宣告它的方法之內,當此方法呼叫別的方法時,該變數還活著,只不過在新的方法中不起作用。
2.區域性變數的壽命會持續到方法執行完畢為止。
3.例項變數的壽命與物件的壽命相同,如果物件還活著,那麼例項變數也還活著。
4.引用型別與基本型別的作用範圍相同,引用型別只有在處於它作用範圍中才能引用物件。
5.當最後一個引用消失時,物件就會變成可回收的。
6.引用有三種方法可以釋放物件:
(1)引用永久性的離開它的作用範圍。
(2)引用被賦值到其他的物件身上。
(3)直接將引用設定為null。
7.區域性變數也稱為臨時變數、棧變數。