黑馬程序員--Java基礎學習筆記【構造器、靜態】

 

 ------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------    

 

  • 構造方法,構造器(constructor)

用於給對象的數據進行初始化,每個類都有構造方法。構造方法可以重載。

默認構造方法:如果沒有定義,系統會給出默認的無參的空構造方法

構造方法的格式:

    方法名與類名相同;沒有返回值類型;沒有具體的返回值,不需要寫return

構造方法的運行和作用:

    創建對象時,僅執行一次;創建對象時,對成員變量初始化賦值

this 關鍵字的使用

    一個構造方法可以通過this關鍵字調用另外一個重載的構造方法

    this語句: 格式 this(參數列表); // 調用其他構造方法

    注意:this 語句只能寫在構造方法裏面,且必須是第一行

類的初始化過程

    加載 Student.class 文件進內存(方法區)

    在棧內存爲引用變量 stu 開闢空間

    在堆內存爲學生對象開闢空間

    對學生對象的成員變量進行默認初始化

    對學生對象的成員變量進行顯示初始化

    通過構造方法對學生對象的成員變量賦值

    學生對象初始化完畢,把對象地址賦值給 stu 變量

  • static 關鍵字   成員修飾符,修飾成員,不能修飾局部

靜態成員可以被類名直接調用 類名.靜態成員,非靜態成員只能被對象調用

  • 修飾成員變量 靜態成員變量

用 static 修飾的成員變量不屬於對象的數據結構

static 變量是屬於類的變量,可以通過類名來引用 static 成員

static 成員變量和類的信息一起存儲在方法區,而不是在堆中,

一個類的 static 成員變量只有“一份”,無論該類創建了多少對象

  • 修飾方法

    static 修飾的方法不需要針對某些對象進行操作,其運行結果僅僅與輸入的參數有關,調用時直接用類名引用。

    double c = Math.sqrt(3.0 * 3.0 +4.0 * 4.0);

    // 該方法在調用時,沒有隱式的傳遞對象引用,因此在 static 方法中不可以使用 this 關鍵字

    由於 static 在調用時沒有具體的對象,因此在 static 方法中不能對非 static 成員(對象成員)進行訪問。static 方法的作用在於提供一些“工具方法”和“工廠方法”等。

  • 修飾代碼塊

static 塊:屬於類的代碼塊,在類加載期間執行的代碼塊,只執行一次,可以用來在軟件中加載靜態資源。

  • 靜態成員變量和非靜態成員變量的區別:

        內存位置:

            靜態成員變量,存儲到方法區的靜態區

            非靜態成員變量,存儲到堆內存

        生命週期:

            靜態成員變量,隨着類的加載而加載,隨着類的死亡而死亡,生命最長

            非靜態成員變量,隨着對象的加載而加載,隨着對象的死亡而死亡,生命相對較長

        調用方式:

            靜態成員變量,不屬於對象,屬於自己的類,類變量通過類名直接調用

            非靜態成員變量,屬於對象,只能對象調用

        *作用上:

            靜態成員變量,是所有對象的共享數據

            非靜態成員變量,是對象的特有數據

 

class Person{

 

    Stringname= "呵呵";

    static String country = "China";

 

    publicvoid show() {

       System.out.println(name + country);

    }

 

    publicstaticvoid function() {

       // 錯誤:無法從靜態上下文中引用非靜態變量à生命週期不一樣

/*

        * 靜態方法中,使用了非靜態變量,靜態不能直接調用非靜態

        * 因爲靜態成員優先於非靜態成員進入內存

        */

       // System.out.println(name + country + "in static function");

    }

   

    publicstaticvoid method(){

       //  this 表示本類對象,靜態方法中,不能寫 this, super

//  System.out.println(super);

        //System.out.println(this);

//  super.hashCode();

    }

}

 

publicclassPersonDemo {

    publicstaticvoid main(String[] args) {

       Person.function();

    }

}

 

類的成員變量、局部變量、實例成員變量、類成員變量

    類的成員變量:定義在類中的變量

    局部變量:定義在方法或語句中的變量

    實例成員變量:非靜態成員變量,對象調用

    類成員變量:靜態成員變量,類名調用

 

代碼塊:局部代碼塊,構造代碼塊,靜態代碼塊,同步代碼塊(多線程)

    局部代碼塊:在方法中出現,限制變量生命週期

    構造代碼塊:定義在類中方法外,多個構造方法中相同的代碼存放到一起,每次調用構造都執行,並且在構造方法前執行。

    靜態代碼塊:定義在類中方法外,static 修飾符。用於給類進行初始化,在加載的時候只執行一次。

靜態代碼塊,構造代碼塊,構造方法的執行順序:

靜態代碼塊,構造代碼塊,構造方法

 

class Person

{

    Person(){

     System.out.println("構造方法");

    }

 

    {

     System.out.println("構造代碼塊");

    }

 

    static{

     System.out.println("靜態代碼塊");

    }

    public static void a(){}

   

}

class Code

{

    public static void main(String[]args)

    {

        Person.a(); // 靜態代碼塊執行

        new Person(); // 構造代碼塊和構造方法執行

    }

}


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