static 表示靜態,它可以修飾屬性,方法和程式碼區塊。
1.static修飾屬性(類變量),那麼這個屬性就可以用類名.屬性名來訪問,也就是使這個屬性成為本類的類變量,為本類對象所共有。這個屬性就是全類公有。 (共有的類別變數與物件無關,只和類別有關)。
類別載入的過程,類別本身也是保存在檔案中(字節碼檔案保存著類別的資訊)的,java會透過I/O流把類別的檔案(字節碼檔案)讀入JVM(java虛擬機),這個過程成為類別的載入。 JVM(java虛擬機器)會透過類別路徑(CLASSPATH)來找字節碼檔案。
類別變數,會在載入時自動初始化,初始化規則和實例變數相同。
注意:類別中的實例變數是在創建物件時被初始化的,被static修飾的屬性,也就是類別變量,是在類別載入時被建立並進行初始化,類別載入的過程是進行一次。也就是類別變數只會被創建一次。
2.static修飾方法(靜態方法),會使這個方法成為整個類別所公有的方法,可以用類別名稱.方法名稱存取。
注意:static修飾的方法,不直接能存取本類別中的非靜態(static)成員(包括方法和屬性),本類別的非靜態(static)方法可以存取本類別的靜態成員(包括方法和屬性),可以呼叫靜態方法。靜態方法要慎重使用。在靜態方法中不能出現this關鍵字。
注意:父類別中是靜態方法,子類別中不能覆寫為非靜態方法,在符合覆蓋規則的前提下,在父子類別中,父類別中的靜態方法可以被子類別中的靜態方法覆蓋,但是沒有多態。 (在使用物件呼叫靜態方法是其實是呼叫編譯時類型的靜態方法)
注意:父子類別中,靜態方法只能被靜態方法覆寫,父子類別中,非靜態方法只能被非靜態方法覆寫。
java中的main方法必須寫成static的因為,在類別載入時無法建立對象,因為靜態方法可以不透過物件呼叫所以在類別的main方法。所在在類別載入時就可以透過main方法入口來執行程式。
3.static修飾初始程式碼區塊,這時這個初始程式碼區塊就叫做靜態初始程式碼區塊,這個程式碼區塊只在類別載入時執行一次。可以用靜態初始程式碼區塊初始化一個類別。
動態初始程式碼區塊,寫在類別中的“{}”,這個程式碼區塊是在產生物件的初始化屬性是運行。這種程式碼區塊叫動態初始程式碼區塊。
類在什麼時候會被加載,創建對象時會加載類,調用類中靜態方法或訪問靜態屬性也是會加載類的。在載入子類別時必會先載入父類,類別載入會有延遲載入原則,只有在必須載入時才會載入。
final修飾符,可以修飾變量,方法,類別
1.final修飾變數
被fianl修飾的變數就會變成常數(常數應大寫),一旦賦值不能改變,(可以在初始化時直接賦值,也可以在構造方法裡也可以賦值,只能在這兩種方法裡二選一,不能不為常數賦值),fianl的常數不會有預設初始值,對於直接在初始化是賦值時final修飾符常和static修飾符一起使用。
2.final修飾方法,被final修飾的方法將不能被其子類別覆蓋,並且保持方法的穩定不能被覆蓋。
3.final修飾類,被final修飾的類別將不能被繼承。 final類別中的方法也都是final的。
注意:final,不能用來修飾構造方法,在父類別中如果有常數屬性,在子類別中使用常數屬性時是不會進行父類別的類別載入。
不變模式,物件一旦建立屬性就不會改變。用final修飾屬性,也用final修飾類別(強不變模式),用final修飾屬性(弱不變模式)。
不變模式的典型體現:java.lang.String類,不變模式可以實現物件的共享(可以用一個物件實例賦值給多個物件變數)
池化的思想,把需要共享的資料放在池中(節省空間,共享資料)
只有String類別可以用「」中的字面值建立物件。在String類別中,以字面值建立時,會到Java方法空間的串池空間中去查找,如果有就回傳串池中字串的位址,並把這個位址付給物件變數。如果沒有則會在串列池中建立字串對象,並傳回其地址付購對象變量,當另一個以字面值建立對象時則會重複上述過程。
如果是new在堆空間中建立String類別的對象,則不會有上述的過程。
String類別中的intern()方法會將在堆空間中建立的String類別物件中的字串和串池中的比對,如果有相同的字串就傳回這個串的串池中的位址。
不變模式在對於物件進行修改,添加操作是使相當麻煩的,他會產生很多的中間垃圾物件。創建和銷毀的資源的開銷是相當大的。
String類別在字串連接時會先的效率很低,就是因為它所產生的物件的書性是不能夠修改的,當連接字串時也就是只能建立新的物件。
對於很多的字串連接,應當使用StringBuffer類,在使用這個類別的物件來進行字串連接時就不會有多餘的中間物件生成,從而優化了效率。
abstract(抽象)修飾符,可以修飾類別和方法
1.abstract修飾類,會使這個類別成為一個抽象類,這個類別將不能產生物件實例,但可以做為物件變數聲明的類型,也就是編譯時類型,抽象類別就像當於一類別的半成品,需要子類別繼承並覆寫其中的抽象方法。
2.abstract修飾方法,會使這個方法變成抽象方法,也就是只有聲明(定義)而沒有實現,實現部分以";"代替。需要子類別繼承實作(覆蓋)。
注意:有抽象方法的類別一定是抽象類別。但是抽象類別中不一定都是抽象方法,也可以全是具體方法。
abstract修飾符在修飾類別時必須放在類別名稱前。
abstract修飾方法就是要求其子類別覆寫(實作)這個方法。呼叫時可以以多型方式呼叫子類別覆寫(實作)後的方法,也就是說抽象方法必須在其子類別中實現,除非子類別本身也是抽象類別。
注意:父類是抽象類,其中有抽象方法,那麼子類繼承父類,並把父類中的所有抽象方法都實現(覆蓋)了,子類才有創建對象的實例的能力,否則子類別也必須是抽象類別。抽象類別中可以有建構方法,是子類別在建構子類別物件時需要呼叫的父類別(抽象類別)的建構方法。
final和abstract,private和abstract,static和abstract,這些是不能放在一起的修飾符,因為abstract修飾的方法是必須在其子類中實現(覆蓋),才能以多態方式調用,以上修飾符在修飾方法時期子類別都覆寫不了這個方法,final是不可以覆寫,private是不能夠繼承到子類,所以也就不能覆寫,static是可以覆寫的,但是在呼叫時會呼叫編譯時類型的方法,因為呼叫的是父類別的方法,而父類別的方法又是抽象的方法,又不能夠調用,所以上的修飾符不能放在一起。
抽象(abstract)方法代表了某種標準,定義標準,定義功能,在子類別中去實作功能(子類別繼承了父類別並需要給出從父類別繼承的抽象方法的實作)。
方法一時間想不到怎麼被實現,或有意要子類別去實現而定義某種標準,這個方法可以被定義為抽象。 (abstract)
模板方法模式
用abstract把製訂標準和實現標準分開,制定的標準就是模板,實現就是按模板標準來實現,也就是繼承模板,實現模板中對應功能的方法。模板中不允許修改的方法可以用fianl來修飾,這個方法不能使抽象方法,為確保安全,封裝,把模板中不公開的部分用protected(保護)修飾。
更多Java修飾符 abstract,static,final 的區別詳解相關文章請關注PHP中文網!