1. 程式人生 > >java中的static關鍵字再學習,靜態成員記憶體理解,靜態常量應用,靜態修飾成員在多型呼叫中的問題

java中的static關鍵字再學習,靜態成員記憶體理解,靜態常量應用,靜態修飾成員在多型呼叫中的問題

一、static的啟用原因

1、假設一個Student類,包含三個屬性,姓名,年齡,學校。姓名,年齡不同,但是學校都相同,當例項化這個類時都會對這三個屬性賦初值。由於學校都相同,new的次數越多,就會形成了巨大的浪費。

為了杜絕這種浪費,設定了一個共享資料方法,即static關鍵字。

這就是static的由來,用於共享資料,和方法,減少資源浪費。

也就是說,物件的特有資料用非靜態修飾,物件的特有資料用靜態static修飾。

靜態呼叫方式和非靜態呼叫方式的區別:

非靜態呼叫成員變數時,只能用物件的引用來呼叫。

靜態的呼叫成員變數時,不僅可以用物件引用來呼叫,還可以用類名來呼叫。

二、static修飾的變數屬於共享變數

static修飾的變數,多個物件共享該變數。

三、靜態方法的記憶體理解

1、類進入方法區,首先將靜態方法放到靜態區,由於靜態方法屬於類的,類也進入了靜態區。當開始執行時,jvm將main方法複製一份到棧記憶體壓棧執行。此時靜態變數已經執行,要早於 非靜態存在的。

非靜態是在new例項化以後才開始執行。才開始存在,而靜態在例項化之前就已經存在了。靜態變數在記憶體中只有一份。

四、靜態static的注意事項

1、靜態中不能呼叫非靜態

因為生命週期不同,即:靜態在記憶體中存在的早,而非靜態在記憶體中存在的晚。如果非靜態還未存在,你呼叫個屁?

同理,非靜態可以呼叫靜態。

2、靜態內容不能用this/super關鍵字。

因為:this是本類物件引用,屬於後人呼叫前人,如果沒有建立物件,怎麼用this,this是建立物件後的事,而靜態先於建立物件前。這個的關鍵問題是:在沒有建立物件的情況下用this呼叫了,這顯然是不對的。

即;靜態方法先於物件,this,就是物件,當在靜態方法中用this時,物件還未建立,報錯。

同理super,屬於父類物件引用。如下圖

3、同一個類中,靜態呼叫靜態成員。

靜態記憶體問題很重要,main方法一直都是靜態的。

五、靜態的呼叫

1、成員變數什麼時候用靜態修飾呢?看情況,如果成員變數是共享資料,那麼就加static修飾。

2、成員方法什麼時候用靜態修飾呢?看成員變數而行,若變數都是靜態,那麼方法也應當是靜態,若變數含有非靜態,那方法就是非靜態的。

總結:如果方法沒有呼叫過非靜態成員,將方法定義為靜態。

六、靜態在多型中的問題

多型:編譯看父類,父類有就編譯成功,父類沒有就編譯失敗。

執行,對於靜態方法,執行父類靜態方法。因為:靜態屬於類,不屬於物件。靜態和物件無關。用父類應用呼叫靜態方法,必然呼叫父類靜態方法。記住:靜態和物件無關。

對於非靜態方法,執行子類的重寫方法。

對於成員變數,編譯執行全是父類。

七、定義靜態常量

public static final修飾靜態常量。

2、靜態常量在介面中的應用