2013-05-09 5 views
6

私はSCJPをkatherine sierraによって読んでいます。
抽象的なキーワードと最終的なキーワードは、書籍で説明されているように互いに矛盾するので、一緒に使用することはできません。
abstractとstrictfpキーワードをメソッド宣言で一緒に使用できない理由の背後にある理由は?

しかし、strictfpとabstractキーワードを一緒に使用できない理由はわかりません。
strictfpキーワードがJavaでどのように動作するのかまだわかりません。

私の考えでは、抽象strictfpメソッドを宣言し、サブクラスを持ち、そのメソッドを "strictfp way"で実装することができます。

これらのキーワードがうまく一致しない理由は何ですか?
EDIT
私は二重の本をチェックしましたし、それは確かに

インタフェースメソッドが抽象的であるため、彼らは最終的にマークを付けることはできません

、 strictfpとして、またはネイティブを言います。

キャサリン・シエラによるSCJPから。ページ21を参照してください。

私のIDE(Eclipse Juno)では、abstractキーワードとstrictfpキーワードを一緒に使用することはできません。
うーん、どうして?

答えて

6

キャサリン・シエラはおそらく抽象メソッドについて話していました。抽象メソッドは、メソッドシグネチャ(およびもしあればthrows節)を提供するだけなので、抽象メソッドstrictfpを作成するのは意味がありません。具体的なメソッドでサブクラスでそれをオーバーライドする必要があるため、このメソッドは独自のメソッドを持ちます親メソッドの修飾子をオーバーライドする修飾子。つまり、メソッドは修飾子を継承しません。

sctriptfpだけでなく、publicprotected以外の抽象メソッドでは修飾子を使用できないことに注意してください。試してみるとコンパイル時エラーが出ます。

+0

興味深いが、私はオーバーライドメソッドは修飾子を継承しないだろうと言ういくつかの文書を見つけることができるの?メソッドはアクセス修飾子を継承します。 – Ascendant

+1

すべての回答はJLSにあります。メソッドはアクセス修飾子を継承しませんが、修飾子メソッドがデフォルトのものを取得していない場合 - パッケージprivate –

+2

@EvgeniyDorofeevしかし、Java 8のインターフェースにメソッド本体を持たせることができます。なぜ、interfacesに 'strictfp' ? – Pacerier

2

もしあなたがすでにあなたの答えを得ていれば、それはあなたにとって有益かもしれません。

私はフォーラムで尋ねられた同様の質問に遭遇しました。

abstractメソッドは、現在のクラスによって実装されてはならないし、それが具体的なサブクラスで実装しなければならないと言うとstrictfpメソッドを実装する必要があると言うのでabstractstrictfpは、メソッド宣言で一緒に座ることができない理由がありますstrictfpクラスが使用されています(身体を持つ必要があります)。したがって、この場合、両方のキーワードが互いに矛盾するため、両方ともメソッド宣言で一緒に使用することはできません。

しかし、クラスの前にabstractstrictfpを使用することは絶対に合法です。何かのように

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(); 

      } 
    } 
} 
関連する問題