隨堂筆記160307靜態代碼塊設計模式

本節課的內容是靜態(static)、代碼庫、設計模式。

一.static(靜態的):

1.定義變量時:

ex:

class Per{
    public Static String name; 
}

public class Test{
    public static void main(String[] args){
        Per p1 = new Per();
        p1.name = "AAA";
        Per p2 = new Per)();
            System.out.println(p2.name);
                //輸出 AAA
    }
}

1.在上例中,因爲創建類Per時,將name字段定義爲靜態的,所以系統在會把靜態變量放在靜態存儲區,而所有對象實例都共享這一個變量,也就是說創建10個Per的對象實例,只要一個實例設置了name字段,其他實例的name字段都會更改。

2.定義方法時:

ex:

class Person{
    public static String name;

    public static void print(){
        System.out.println(name);
    }
}

public class Test{
    public static void main(String[] args){
        Person.print();
    }
}

1.在上例中:

1.定義了靜態方法後,靜態方法可以直接通過類名來調用,靜態方法也叫做類方法。
2.一般開發中,常把工具類裏的方法定義爲類方法,因爲這種類不需要創建實例,類方法只會存放一份在代碼區,節省了內存空間。
3.靜態方法只能訪問靜態方法和靜態變量。

二.代碼塊:

ex:

class Person{
    Person(){
        System.out.println("這是構造函數");
    }

    {
        System.out.println("這是代碼塊");
    }
}   

public class Test{
    public static void main(String[] args){
        Person p1 = new Person();
        Person p2 = new Person();
    }
}

/*輸出:
    這是代碼塊
    這是構造函數
    這是代碼塊
    這是構造函數
*/

1.通過上例我們可以看出:

1.在類裏,普通代碼塊執行優於構造函數。
2.每創建一次對象,就執行一次代碼塊。

2.靜態代碼塊:

ex:

class Person{
    Person(){
        System.out.println("這是構造函數");
    }

    static{
        System.out.println("這是代碼塊");
    }
}

public class Test{
    static{
        System.out.println("這是主類代碼塊");
    }

    public static void main(String[] args){
        Person p1 = new Person();
        Person p2 = new Person();
    }
}
/*輸出:
    這是代碼塊
    這是構造函數
    這是構造函數
*/

1.通過上例可以看出:

1.靜態代碼塊隨着類的加載而執行,無論new多少個實例,只執行一次。
2.靜態代碼塊主要用於在代碼中只需要執行一次且要在類加載的時候執行,例如鏈接數據庫。

三.單例設計模式:

1.餓漢式:

class Single{
    private static Single s = new Single();
    //靜態屬性,爲了保證內存中只有一份

    private Single(){
    //私有化構造函數,防止任意創建對象實例
    }

    public static Single getSingle(){
        //靜態是爲了能通過類名調用該方法
        return s;
    }
}

1.上例就是餓漢式,在類加載時就創建了一份對象,但有個缺點,就是如果該對象沒有被使用,會浪費內存

2.懶漢式:

class Single{
    Single static s;

    private Single(){
        //私有化的構造函數可以防止任何創建該對象實例
    }

    public static Single getSingle(){
        if(s == null){
            s = new Single();
        }
        return s;
    }
}

1.上例就是懶漢式,跟餓漢式比較,有一個優點就是只有在調用getSingle方法時纔會創建對象實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章