7. JavaSE-構造函數 & this & static關鍵字

構造函數:

    1. 函數名和類名相同,不用定義返回值類型、沒有具體的返回值

    2. 其實就是在創建對象時調用的函數,創建對象都必須經過構造函數初始化

    3. 當使用自定義構造函數的時候,必須在寫一個默認的構造函數


構造函數和普通函數區別:

    1. 構造函數是在對象創建時進行調用,對對象進行初始化

    2. 普通函數是在對象創建後,需要該函數時才進行調用

    3. 構造函數僅在對象創建時調用一次

    4. 普通函數可以重複的調用

    5. 構造函數可以調用普通函數,而普通函數不能調用構造函數

    6. 構造函數可以寫return, 但是注意不要寫return value




什麼時候使用構造函數:

    在描述事物時,該事物一存在就具備了一些內容,這些內容都定義在構造函數中


構造函數重載:

    和普通函數重載同,即函數的參數個數或者類型不同,函數名完全相同


重寫:

    函數名和參數個數及類型完全相同,具體實現內容不同



this關鍵字:

    1. 當成員變量和局部變量重名,可以使用this關鍵字來區分

    2. 本質上:this就代表對象(當前對象),即this就是所在函數所屬對象的引用

       簡單而言,就是哪個對象調用this所在的函數,this就代表哪個對象

    3. this關鍵字也用於在構造函數中調用其他的構造函數

        注意:只能定義在構造函數的第一行,因爲初始化動作要先執行 

 

Static關鍵字:

    1. 數據被static修飾之後,數據將保存在堆內存中。

    2. 在類中,所有對象共享的數據,一般初始化爲靜態數據

    3. 靜態數據在對象實例化之前就已經初始化在堆內存裏面了。即隨着類的加載而初始化

    4. Static修飾的成員被所有對象共享

    5. Static優先於對象存在,因爲static的成員隨着類的加載就已經存在了

    6. Static修飾的成員可以被對象調用,也可以被類名直接調用(類名.靜態成員)

    7. Static修飾的數據是共享數據,對象中存儲的是特有數據

 

成員變量&實例變量&靜態變量:

    1. 成員變量也叫做實例變量;靜態變量也叫做類變量

    2. 成員變量隨着對象的存在而存在,隨着對象的消亡而消亡;

    3. 靜態變量隨着類的加載而存在,隨着類的消失而消失

    4. 成員變量只能被對象調用,靜態變量既可以被對象調用也可以被類調用(強烈不推薦

       使用對象調用,因爲靜態成員先於對象存在)

    5. 成員變量數據存儲在堆內存的對象中,因此也叫做對象的特有數據

    6. 靜態變量數據存儲在共享數據區,所以也叫對象的共享數據。

 

內存分類:本地方法區、寄存器、共享數據區(方法區)、堆、棧

 

靜態方法只能訪問靜態成員(成員變量和成員方法),非靜態方法既可以訪問靜態成員也能訪問非靜態

 

靜態方法中不可以使用this或者super關鍵字,因爲靜態方法是由類名調用的,不依賴於對象,因此不能使用this,而構造方法是非靜態的,因此不能使用super關鍵字

 

主函數:

    1. 主函數是靜態的

    2. 主函數特殊之處:格式固定、被jvm虛擬機所識別和調用

    3. 主函數是public,權限必須是最大的

    4. 主函數必須是static,因爲主函數不需要由對象來調用

    4. 主函數必須是void,沒有具體的返回值

    5. Main:函數名,不是關鍵字,只是一個jvm識別的固定的名字

    6. String[] args:args是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。

 

什麼時候使用static修飾符?

    1. 靜態變量:當分析對象中所具備的值都是相同的,則這個成員就可以被靜態修飾。只要數據在

       對象中是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的;如果是相同的數據,

       對象不需要修改,只需要使用即可,不需要存儲在對象中,定義成靜態的。

    2. 靜態函數:函數是否用靜態修飾,只參考一點,該函數功能是否有訪問到對象的特有數據。簡

       單點說,從源代碼看,該功能是否需要訪問非靜態成員,如果需要,該功能就是非靜態的;如

       果不需要,就可以將該功能定義成靜態的,當然,也可以定義成非靜態,但是非靜態需要被對

       象調用,而僅創建對象訪問非靜態方法沒有訪問特有數據的方法,該對象的創建時沒有意義的。

 

靜態代碼塊:

    1. 隨着類的加載而執行,而且只執行一次(注意:類只加載一次,即使執行兩次創建對象,也不會

       執行兩次,因爲只加載一次)

    2. 作用:用於給類進行初始化

    3. 例如

        class StaticCode

        {

            static int age = 0;

            static {

                age = age + 20;

             }

            static void show()

            {

                System.out.println(age);

            }

        }

        class StaticCodeDemo

        {

            public static void main(String[] args) 

            {

                StaticCode.show();

            }

        }

    靜態代碼塊使用比較少,一般在類中全是靜態成員的時候可能會需要靜態代碼塊

 

構造代碼塊:

    1. 定義在類中沒有被static修飾的代碼塊,即爲構造代碼塊

    2. 與靜態代碼塊不同,構造代碼塊可以給所有對象進行初始化,每次創建對象都會執行,在調用構造方法之前執行;注意與構造方法的差別,構造方法是用來給對應的對象進行針對性的初始化。

 

局部代碼塊:

    1. 定義在方法中

    2. 用於限定局部變量的生命週期


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