abstract為什麼不可以用static native或synchronized修飾
阿新 • • 發佈:2019-02-18
public abstract synchronized void m4();
public abstract native void m2();
public abstract static void m1();
native 本地方法,這種方法和抽象方法及其類似,它也只有方法宣告,沒有方法實現,但是它與抽象方法不同的是,它把具體實現移交給了本地系統的函式庫,而沒有通過虛擬機器,可以說是java與其它語言通訊的一種機制。
那麼我們就來談談這些關鍵字為什麼不能和abstract混用。
首先abstract與static,其實一看他們的作用和屬性就很容易辨別,abstract是沒有實現的,而static一定要有實現,因為abstract的類不能生產物件,但是static是屬於類,而類已經是一個存在的物件,這兩個關鍵字在這上面有一個關鍵的矛盾點。
synchronized 是同步,然而同步是需要有具體操作才能同步的,如果像abstract只有方法宣告,那同步一些什麼東西就會成為一個問題了,當然抽象方法在被子類繼承以後,可以新增同步。
native,這個東西本身就和abstract衝突,他們都是方法的宣告,只是一個吧方法實現移交給子類,另一個是移交給本地作業系統。如果同時出現,就相當於即把實現移交給子類,又把實現移交給本地作業系統,那到底誰來實現具體方法呢?
public abstract native void m2();
public abstract static void m1();
public static final void m3(){};
abstract是抽象的,指的是方法只有宣告而沒有實現,他的實現要放入宣告該類的子類中實現。
static是靜態的,是一種屬於類而不屬於物件的方法或者屬性,而我們知道,類其實也是一個物件,他是在class檔案載入到虛擬機器以後就會產生的物件,通常來說它是單利的,就是整個虛擬機器中只有一個這樣的類物件(當然,如果用新的類載入器也會生成新的類的物件)。
synchronized 是同步,是一種相對執行緒的鎖。
native 本地方法,這種方法和抽象方法及其類似,它也只有方法宣告,沒有方法實現,但是它與抽象方法不同的是,它把具體實現移交給了本地系統的函式庫,而沒有通過虛擬機器,可以說是java與其它語言通訊的一種機制。
那麼我們就來談談這些關鍵字為什麼不能和abstract混用。
首先abstract與static,其實一看他們的作用和屬性就很容易辨別,abstract是沒有實現的,而static一定要有實現,因為abstract的類不能生產物件,但是static是屬於類,而類已經是一個存在的物件,這兩個關鍵字在這上面有一個關鍵的矛盾點。
synchronized 是同步,然而同步是需要有具體操作才能同步的,如果像abstract只有方法宣告,那同步一些什麼東西就會成為一個問題了,當然抽象方法在被子類繼承以後,可以新增同步。
native,這個東西本身就和abstract衝突,他們都是方法的宣告,只是一個吧方法實現移交給子類,另一個是移交給本地作業系統。如果同時出現,就相當於即把實現移交給子類,又把實現移交給本地作業系統,那到底誰來實現具體方法呢?
1).private :因為一個abstract方法需要被重寫,所以不能修飾為private;
2).final:因為一個abstract方法需要被重寫。被final修飾的方法是不能被重寫的,所以不能同final共存;
3).static:因為一個abstract方法沒有方法體。靜態方法需要對方法體執行內容分配空間,所以不能同static共存;