36
interface Bouncable{ } 
interface Colorable extends Bouncable{ } 
class Super implements Colorable{ } 
class Sub extends Super implements Colorable {} // Ok (case -1)

しかし、

class Sub implements Colorable extends Super {} // error (case -2)

case-2がコンパイル エラーを表示する理由{ expected。どうして ??ただし、case-1はエラーなしで実行されます。

4

6 に答える 6

64

extends前に行く必要がありますimplements:

class Sub extends Super implements Colorable {}
于 2012-12-24T13:07:17.100 に答える
8

クラス宣言で extends が implement に先行する理由を示す例があります。

インターフェイス:

public interface IParent {
    void getName();
    void getAddress();
    void getMobileNumber();
}

抽象クラス:

public abstract class Parent {
    public abstract void getAge();
    public void getName(){
        System.out.print("the parent name");
    }
}

子クラス :

public class Child extends Parent implements IParent {

    @Override
    public void getAddress() {
       System.out.print(" Child class overrides the Parent class getAddress()");
    }

    @Override
    public void getMobileNumber() {
        System.out.print(" Child class overrides the Parent class getMobileNumber()");
    }

    @Override
    public void getAge() {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

インターフェイスと抽象クラスの両方に同じメソッド getName() があることを確認すると、抽象クラスではメソッドに実装があります。

実装しようとすると、クラスがインターフェイスのすべての抽象メソッドをオーバーライドすることが必須になり、メソッド getName() の実装が既にある抽象クラスを拡張しようとしています。

Child クラスのインスタンスを作成し、メソッド getName() を

Child child = new Child();
child.getName();

同じメソッド getName() に対して 2 つの実装が存在するため、子がどのメソッド実装を呼び出すかについて競合が発生します。

この競合を回避するために、最初に拡張し、後でインターフェースを実装することが必須になりました。

したがって、抽象クラスにインターフェースと同じメソッドがあり、抽象クラスがすでにメソッドを実装している場合、子クラスの場合、そのメソッドをオーバーライドする必要はありません

于 2014-04-30T10:38:53.507 に答える
1

JLS構文ページでのクラス定義の構文は次のとおりです。

NormalClassDeclaration: 
    class Identifier [TypeParameters] [extends Type] [implements TypeList] ClassBody

構文規則を単純化するために、それらはそれを互換性のあるものにしなかったと思います。

互換性を持たせるには、おそらく次のようなものが必要です。

NormalClassDeclaration: 
    class Identifier [TypeParameters] [ExtendsImplements] ClassBody

ExtendsImplements:
    [extends Type] [implements TypeList] | [implements TypeList] [extends Type]

または、最悪の場合、を宣言して使用する必要があるかもしれExtendsませImplementsOR

解析ルールを乱雑にする価値があることはそれほど重要ではないと思います。

于 2012-12-24T13:20:18.937 に答える
1

これはJLSの仕様によるものです。また、Java でクラスを宣言しようとすると、特定の要素順序があります。

  • publicprivateなどの修飾子。
  • 慣例により頭文字を大文字にしたクラス名。
  • クラスの親 (スーパークラス) の名前 (存在する場合) の前にキーワードextends. クラスは、1 つの親のみを拡張 (サブクラス化) できます。
  • クラスによって実装されたインターフェースのコンマ区切りリスト (存在する場合) の前にキーワードimplements. クラスは、複数のインターフェースを実装できます。
  • 中括弧で囲まれたクラス本体{ }.

参照:

http://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html

于 2012-12-24T13:13:27.800 に答える
0

あなたはこのようにしなければなりません。1つのクラスのみを拡張できますが、コンマで個別に複数のインターフェースを実装できます。実装する前に最初に拡張する方が読みやすいでしょう

class Sub extends Super implements Colorable
于 2012-12-24T13:19:27.833 に答える