1. 程式人生 > >《程式設計思想》5.初始化與清理

《程式設計思想》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