作為剛入門Java的小白,對於public,private,final,static等概念總是搞不清楚,到底都代表着什么,這里做一個簡單的梳理,和大家分享,若有錯誤請指正,謝謝~
訪問權限修飾符
public和private是訪問權限修飾符,用於控制外界對類內部成員的訪問。
public:表明對象成員是完全共有的,外界可以隨意訪問。
private:表明對象成員是完全私有的,不容許外界的任何訪問。
具體關於public,private的內容請移步:Java對象成員的封裝, 進一步有關protected的內容請移步:Java繼承
類成員變化修飾符
static和final是控制類成員變化的修飾符。
static:靜態成員修飾符,其修飾的靜態變量脫離具體對象獨立存在,在內存中之后一份拷貝,所有的對象都公用這一個存儲空間,所以對static修飾的靜態變量進行的修改對該類的所有對象都起作用。static修飾的靜態函數代表所有對象的統一操作,只能調用靜態變量。static是針對面向對象中的“多態”而提出來的,static修飾的靜態成員不存在多態性。
final:final用來修飾方法和屬性表示特殊的意義。修飾方法時表示方法不能被重寫;修飾屬性時表示屬性不能被改變,這里屬性又分為對象和基本類型,修飾基本類型表示基本類型賦值以后不能再被賦值,修飾對象表示這個屬性不能再指向其他對象(引用不變),但是他指向的這個對象本身還是可以被改變的。
既然final方法不可重寫,那下面這段程序是否有錯呢?
class Base { private final void method() { System.out.println("In Base..."); } } class Sub extends Base { public void method() { System.out.println("In Sub..."); } }
答案: 正確的。
使用final關鍵字可以聲明類、成員變量和成員方法,一經聲明,便不可繼承、不可修改和不能覆蓋。
本例中,基類方法 是private ,他在子類中是不可見的,故子類中的 同名方法 不再是覆蓋,相當於一個新的方法名。
這種情況比較特殊,書上說 如果子類中的一個方法與它超類中的方法有相同的方法名和參數簽名,稱子類中的方法覆蓋(override)超類中的方法。 這種說法是不嚴密的。
額外小知識:
final方法不能被子類覆蓋。編譯器在調用final方法時會轉入內嵌機制(直接將方法主體插入到調用處),大大提高執行效率(50%左右)。API類中的許多方法,如Object類中的getClass方法為final方法。
說明:final不能用於修飾構造方法。