static final private方法的區別

2021-08-27 23:01:57 字數 2340 閱讀 3520

public class finalandprivate 

}class parent

public void call()

private final void show2()

public void call2()

public final void print()

public static void staticmethod()

}class fap extends parent

//override

public void call()

public void show2()

/* * 編譯錯誤,不能覆蓋(override)超類的final方法

public final void print() */

//可以過載(overload)

public final void print(string str)

/* * 編譯錯誤,不能覆蓋(override)超類的static方法

public void staticmethod()

*/public static void staticmethod()

}

輸出為:

super.call() is calling...

super.show() is calling...

super.call2() is calling...

super.show2() is calling...

super.print() is calling...

super.staticmethod() is calling...

***********************************==

fap.call() is calling...

fap.show() is calling...

super.call2() is calling...

super.show2() is calling...

super.print() is calling...

super.staticmethod() is calling...

***********************************==

fap.call() is calling...

fap.show() is calling...

super.call2() is calling...

super.show2() is calling...

super.print() is calling...

fap.print(string str) is calling... message = hello world

fap.staticmethod() is calling...

* static方法不能被覆蓋,因為方法覆蓋是基於執行時動態繫結的,而static方法是編譯時靜態繫結的。

對靜態方法的呼叫不存在任何動態的分派機制。 當乙個程式呼叫了乙個靜態方法時,要被呼叫的方法

都是在編譯時刻被選定的, 而這種選定是基於修飾符的編譯期型別而做出的。

子類中可以建立相同簽名static的方法,但是不會覆蓋父類的static方法。

不能建立相同簽名的非static方法,編譯器會認為試圖覆蓋static方法而報錯。

* 方法過載的選擇是在編譯時靜態繫結的,方法覆蓋的選擇是在執行時根據具體型別動態繫結的。

編譯時會根據方法呼叫時使用的介面或者基類的方法簽名決定呼叫哪乙個介面方法,執行時

再根據當前物件的具體型別,判斷介面方法在當前物件所屬類的實現中是否被覆蓋過,如果覆蓋了就

呼叫覆蓋過的版本,否則呼叫介面方法。

* final方法和private方法的區別:

類中任何private方法預設是private final的,因為你不能訪問乙個private方法,所以你不能覆蓋它。

(雖然當你試圖覆蓋乙個private方法時,編譯器沒有給出錯提示,但你並沒有覆蓋這個方法,你只是

建立了乙個新的方法而已。)

final方法通常不會是private的,所以一般在子類或者類外部可以訪問,由於其在子類中可見,所以不能

建立相同簽名的方法。

* private方法只可以在類的內部使用,在類外根本訪問不到,而final方法可以在類外訪問,

但是不可以重寫該方法(在子類中試圖覆蓋時編譯器會給出錯誤提示,申明final方法不能被覆蓋。),

就是說可以使用該方法的功能但是不可以改變其功能,這就是private方法和final方法的最大區別。

* final的方法可以內聯(inline)優化,private的和static的也可以進行同樣的優化。

hotspot方法區的變化

jdk1.6及之前 有永久代,靜態變數存在永久代上 jdk1.7 有永久代,但已經逐步 去永久代 字串常量池,靜態變數移除儲存在堆中 jdk8及以後 無永久代,型別資訊,字段,方法,常量儲存在本地記憶體的元空間,但是字串常量池,靜態變數任然儲存在堆上 jdk7及以前 永久代 佔jvm記憶體大小 jd...

縮小客戶區 擴大非客戶區 的方法

當windows收到 wm nccalcsize 訊息時會指定客戶區大小,我們可以在這個時候設定客戶區的大小。引數lparam是乙個nccalcsize params結構,儲存包含三個矩形的陣列。第乙個矩形儲存視窗的客戶區。你只要改寫這個矩形的值就可以修改客戶區的大小了。修改了客戶區的大小後,還要響...

Python的類方法,靜態方法,例項方法的區別

在python中常用的類裡面定義的方法有三種 分別是類方法,靜態方法,例項方法 其中類方法需要使用 classmethod裝飾器 靜態方法需要使用 staticmethod裝飾器 類方法引數cls,例項方法引數self,靜態方法相當於寄存在這個類中的方法。類方法可以使用直接呼叫,通過類名.呼叫,例項...