5

コンストラクターはJavaで継承できないことを知っています.super()を使用する必要があります.superはコンストラクターの最初のステートメントでなければなりません。

しかし、なぜ@Override注釈を使用できないのですか?

例:

public class Foo extends Point2D.Double {
    @Override // The annotation @Override is disallowed for this location
    public Foo(){}
}

Foo のインスタンスがあれば、Point2D.Double.Double()直接呼び出すことはできません! この動作は完全にオーバーライドと同じです!

4

8 に答える 8

0

親クラスにメソッドがある場合にのみオーバーライドできます。親クラスには Foo() メソッドがないため、オーバーライドは許可されません。

次のようなコンストラクターのオーバーライドについて質問しているとは思いません

public class Foo extends Point2D.Double {
    public Double(){
    }
}

これは単に許可されていません。ただし、各サブクラス コンストラクターは、サブクラス内の別のコンストラクターまたはスーパークラス内のコンストラクターにチェーンする必要があります。たとえば、次のようになります。

public class Superclass
{
    public Superclass(int x) {}

    public Superclass(String y) {}
}

public class Subclass extends Superclass
{
    public Subclass()
    {
        super(5); // chain to Superclass(int) constructor
    }
}

継承されていないコンストラクターの意味は、これを行うことができないということです:

// Invalid
Subclass x = new Subclass("hello");
于 2013-09-11T09:41:55.667 に答える
0

オーバーライドをまったく実行しない場合があります。そのため、その注釈を使用できません。super()新しいコンストラクターを宣言すると、Java によって呼び出されることが保証されます。強制する必要はありません。さらに、 の前に追加の操作を適用することはできませんsuper()。これは、親クラスからデフォルトのコンストラクターを呼び出す必要がある場合、特別なことをする必要がないという結論につながります。

パラメーター化されたコンストラクターの使用を強制する場合はケースが変わり、その呼び出しを子クラスに追加する必要があります。ただし、親クラスにデフォルトのコンストラクターがない場合は、常にパラメーター化されたコンストラクターを呼び出す必要があります。

于 2013-09-11T09:43:13.090 に答える
0

オーバーライドされるFooの以前の実装がないためです。

于 2013-09-11T09:35:46.873 に答える
0

@Override子クラスで夕食クラス(親クラス)のメソッドをオーバーライドする箇所を示します。コンストラクターはメソッドではなく、そのようにオーバーライドすることはできません。だから、そこに置くことはできません@Override

于 2013-09-11T09:37:08.030 に答える