《程式設計思想》5.初始化與清理
方法過載:
1. 當建立一個物件時,也就給此物件分配到的儲存空間取一個名字。所謂方法則是給某個動作取的名字。通過使用名字,你可以引用所有的物件和方法
2.每個過載的方法都必須有一個獨一無二的引數型別列表。引數順序的不同也足以區分兩個方法。不過一般情況下別這麼做,因為這會使程式碼難以維護。
3.涉及基本型別的過載:
如果傳入的資料型別(實際引數型別)小於方法中宣告的形式引數型別,實際資料型別就會被提升。char型略有不同,如果無法找到恰好接受char引數的方法,就會把char直接提升到int型
如果傳入的實際引數較大,就得通過型別轉換來執行窄化轉換。如果不這樣做,編譯器就會報錯 f1((float)x)
this關鍵字:
1.this關鍵字只能在方法內部使用,表示對”呼叫方法的那個物件“的引用。this的用法和其他物件引用並無不同。
清理:終結處理和垃圾回收
1.假定你的物件(並非使用new)獲得了一塊”特殊"的記憶體區域,由於垃圾回收器只知道釋放那些經由new分配的記憶體,所以它不知道該如何釋放改物件的這塊“特殊"記憶體。
2.用finalize(),就能在垃圾回收時刻做一些重要的清理工作。例如:java呼叫C的程式碼
垃圾回收如何工作
1.Java虛擬機器中,堆的實現截然不同:它更像一個傳送帶,每分配一個新物件,它就往前移動一格。這意味著物件儲存空間的分配速度非常快。Java的”堆指標“只是簡單地移動到尚未分配的區域,其效率比得上C++在堆疊上分配空間的效率。
構造器初始化
1.初始化順序: 在類的內部,變數定義的先後順序決定了初始化的順序。即使變數定義散佈於方法定義之間,它們仍舊會在任何方法(包括構造器)被呼叫之前得到初始化。例如
class Window { Window(int marker){ print("Window(" + marker + ")"); } } class House { Window w1 = new Window(1); //Before constructor House() { //Show that we're in the constructor: print("House()"); w3 = new Window(33); //Reinitialize w2 } Window w2 = new Window(2); //After constructor void f() { print("f()"); } Window w3 = new Window(3); //At end } public class OrderOfInitialization { public static void main(String[] args) { House h = new House(); h.f(); } } /*Output: Window(1) Window(2) Window(3) House() Window(33) f() */
靜態資料的初始化
無論建立多少個物件,靜態資料都只佔用一份儲存區域。static關鍵字不能應用於區域性變數,因此它只能作用於域。如果一個域是靜態的基本型別域,且也沒有對它進行初始化,那麼它就會獲得基本型別的標準初值;如果它是一個物件引用,那麼它的初始值就是null
public class StaticInitialization {
public static void main(String[] args) {
print("Createint new Cupboard() in main");
new Cupboard();
print("Createing new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table(){
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
/*
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Createing new Cupboard() in
Bowl(3)
Cupboard()
f1(2)
Creatint new Cupboard() in
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/
顯式的靜態化初始化
Java