static,final,transient關鍵字的研究
阿新 • • 發佈:2019-01-10
1.static關鍵字首先,當建立一個類的時候,就是在描述那個類的物件的外觀與行為,除非用new建立那個類的物件,否則,實際上沒有獲得任何物件,執行new來建立物件的時候,資料儲存空間才被分配。其方法才被其他類呼叫。static關鍵字解決了實際使用中的兩個問題。1) 為特定的域分配單一的儲存空間,這個空間與建立的物件沒有關係。(靜態域)。static關鍵字不能應用於區域性變數。2) 將一個方法單獨出來,不與它的類產生關聯(靜態方法)。在靜態方方中,不能引用非靜態方法。關於static的其他用法,靜態導包。普通的匯入:import com.... 靜態匯入:import static com....靜態導包可以將指定的包下的靜態方法匯入。匯入之後,在類中可以直接使用方法名方法方法,而不是使用[類名.方法名]的形式進行引用。比如System.out.println()就可以使用println()直接使用。該特性在Java5中加入。static還與類的初始化有關係。靜態物件的初始化問題,靜態物件只有在必要的時刻才會進行,如果不進行引用,則永遠都不會被建立,只有在第一個物件被建立,或者第一次訪問靜態資料的時候,才會被建立,並且此後不會再被初始化。物件的建立過程:1) 構造器即使沒有顯式的使用static關鍵字,它也是靜態方法。當抽次建立物件時,或者靜態方法被訪問時,java直譯器查詢類路徑,以定位類.class檔案。2)載入class檔案,有關靜態初始化的所有動作都會執行。3)使用new在建立物件的時候,首先在堆上為物件分配足夠的儲存空間。4)這塊空間清零,所有引用設定null,所有基本型別設定成預設值。5)執行所有欄位定義處的初始化動作。6)執行構造器。以上可以看出,static的初始化是在建構函式之前執行的。2.final關鍵字通常final指“不可改變的”,使用final的原因通常出於兩個目的:1)設計2)效率設計指的是,在系統的設計中,使用一個不可變的常量,使得在程式執行的各個部分,這個常量的值是一樣的。2.final關鍵字final關鍵字可能修飾的物件有,方法,資料,類。final形容基本資料型別:說明資料在初始化之後就不能改變。所以final形容的資料,在初始化的時候,必須指定資料的值。一個即使static又是final的資料,佔用一個不能改變的儲存空間。final形容引用型別的時候,final使引用恆久不變,一旦引用初始化的時候被final修飾。這個引用指向的物件就不能改變。但是指向的物件是可以改變的。java未提供任何一個可以使物件恆定不變的方法。但是自己可以實現這個效果。final資料型別的特殊使用,“空白”final,正常情況下,一個final的資料在宣告的時候就需要給其賦值,但是有這種情況,一個類裡面可以有空白的final資料,這個空白的資料可以在使用不同的構造方法的時候,擁有不同的值。但是,所有的final資料必須在每個構造方法中給其賦值。所以final域在使用之前總是能被初始化。final引數:在方法中的引數列表中,可以將引數宣告成final的。這時,你可以讀取引數,但是不可以對引數進行任何修改的操作。final方法的主要原因是:宣告方法不能被覆蓋,這個方法在類的繼承中,始終保持不變。在最初final方法的使用還有另一個效率的原因。final方法將被編譯器優化成方法呼叫機制,但是至JDK5之後,就不會使用final進行效率優化。將執行的效率交由虛擬機器進行管理。所以現在主要使用final的原因就是基於設計的,宣告方法是不能被覆蓋的。任何一個private方法都是隱式的final方法。因為private方法不能被繼承,不能被覆蓋。如果給一個private方法新增final,也不會有任何改變。如果在一個子類中覆蓋了超類的private方法(實際上並沒有)。編譯器不會報錯。這裡只是看似覆蓋了超類中的private方法。實際上,子類只是聲明瞭一個同名的private方法,因為覆蓋只能覆蓋超類介面中的方法。而private方法不會在超類的介面中出現。這裡的覆蓋只是一個幻覺。final類:宣告一個final類,證明你不想繼承這個類,也不允許任何人繼承這個類。這樣做有兩個理由。1) 基於設計,你不需要對這個類進行任何的變動 。2) 基於安全,你不需要它有任何子類。final類中的域,可以選擇是final或者不是final。由於類是final的,所有final類中的方法有事隱式的final的。關於final類,java程式設計思想中有過一些忠告。總的來說,一般預見的不可繼承的設計,無法準確的預見一個類在之後是否會被繼承使用,所以,使用final類的時候,一定要認真的考慮。如果此篇文章有幫助到您,請您也支援一下我的論壇 www.ymkfw.com,本論壇旨在為程式設計師和開發者搭建一個輕鬆自在的小窩。