2013-05-09 26 views
6

我正在讀凱瑟琳塞拉利昂的SCJP。
我明白,抽象和最終關鍵字不能一起使用,因爲它們相互矛盾,如書中所解釋的。
爲什麼在方法聲明中不能同時使用abstract和strictfp關鍵字的原因是什麼?

但是,我不明白爲什麼strictfp和abstract關鍵字不能一起使用。
我不知道strictfp關鍵字如何在Java中完全適用。

在我的想法中,我們可以聲明一個抽象的strictfp方法,擁有一個子類,並以「strictfp方式」實現該方法。

這些關鍵詞之所以不協調,原因是什麼?
編輯
我仔細檢查過這本書,它肯定說

因爲接口方法是抽象的,它們不能被標記爲final, strictfp,或本機。

來自SCJP by Katherine Sierra。第21頁。

另外我的IDE(Eclipse Juno)說我不能同時使用abstract和strictfp關鍵字。
嗯,爲什麼不呢?

回答

6

凱瑟琳塞拉德可能是在談論抽象方法。抽象方法strictfp是沒有意義的,因爲抽象方法只是提供一個方法簽名(並且拋出子句,如果有的話),爲了使用它,我們需要用一個具體方法在子類中重寫它,並且這個方法將擁有自己的方法將會覆蓋其父方法修飾符的修飾符。也就是說,方法不會繼承修飾符。

請注意,它不僅是sctriptfp,但抽象方法不允許使用修飾符,除了publicprotected。如果你嘗試,你會得到一個編譯時錯誤。

+0

有趣的是,我在哪裏可以找到一些文件是說一個壓倒一切的方法不會繼承修飾符?方法繼承訪問修飾符,對吧? – Ascendant 2013-05-09 02:31:27

+1

所有答案都在JLS中。方法不會繼承訪問修飾符,如果您沒有指定修飾符方法獲取默認的方法 - 私有包 – 2013-05-09 02:35:36

+2

@EvgeniyDorofeev,但是我們可以在Java 8中的接口中擁有方法體。那麼,爲什麼不能在接口中使用'strictfp' ? – Pacerier 2014-08-21 17:18:32

2

希望你現在已經得到了你的答案,如果不是,那麼它可能對你有用。

我遇到了類似的問題在論壇上提出。

爲什麼abstractstrictfp不能坐在一起在方法聲明的原因是因爲abstract說,該方法不能由當前類實現,它必須通過具體的子類實現和strictfp說的方法應該實施(應該有一個身體)由類使用strictfp。因此,在這種情況下,兩個關鍵詞相互矛盾,因此兩個方法聲明中不允許在一起。

但在課前使用abstractstrictfp是絕對合法的。像

public abstract strictfp class MyAbstractClass{}  //is ok 

東西,如果你在一個抽象類中聲明strictfp那麼它的所有方法將會被默認strictfp。記住所有類中的具體方法,而不是抽象方法。

運行下面給出的例子,看到OP:

import java.lang.reflect.*; 
public abstract strictfp class AbstractStrictfp 
{ 
    public abstract void abstractMethod(); 
    public void concreteMethod(){}; 

    public static void main(String args[]){ 
      Method methods[] = AbstractStrictfp.class.getMethods(); 
      for(Method method : methods){ 
       System.out.println("Method Name::"+method.getName()); 
        System.out.println("Modifiers::"+Modifier.toString(method.getModifiers())); 
       System.out.println(); 

      } 
    } 
} 
相關問題