9

Java で次のコードがあるとします。

class A {

    public int add(int a , int b) {
        return (a+b);
    }
}

class B extends A {
    public float add(float a , float b) {
        return (a+b);
}

この特定のケースでは、サブクラスは基本クラスのadd関数を正確にオーバーライドしていません。これは、サブクラスが異なるシグネチャを持ち、オーバーロードの概念が同じスコープ内にある場合にのみ発生するためです。では、add(float , float)サブクラスの関数Bはまったく新しい関数として扱われ、オーバーロードとオーバーライドの概念は適用されませんか? 「静的バインディング」または「動的バインディング」を使用しますか?

4

9 に答える 9

4

クラス b のメソッド add は、クラス a の add のオーバーロードです。オーバーライドではありません。オーバーライドは、元の add メソッドの別の実装になります。

于 2013-03-08T10:09:41.230 に答える
2

簡単に言えば、はい。をオーバーライドするには、メソッド名、パラメーター、および戻り値の型を含む完全なメソッド シグネチャを複製する必要があります。チュートリアルから

スーパークラスのインスタンス メソッドと同じシグネチャ (名前とそのパラメータの数と型) と戻り値の型を持つサブクラスのインスタンス メソッドは、スーパークラスのメソッドをオーバーライドします。

メソッドを正常にオーバーライドしない場合、コンパイラ エラーをトリガーする@Override アノテーションを検討することをお勧めします。

この特定の例では、ジェネリックを含むいくつかのソリューションほどオーバーライドする必要がないように見えるかもしれません。a<Integer>したがって、クラスと同様のクラスをインスタンス化できますa<Float>

于 2013-03-08T10:08:58.280 に答える
2

その場合、署名が異なるため、メソッドをオーバーライドしていません。

ただし、クラス b にはオーバーロードがあります。これは、名前が同じでパラメーターが異なる 2 つのメソッドがあるためです (1 つはクラス a の場合、もう 1 つはクラス b の場合)。

それが役に立てば幸い。

于 2013-03-08T10:10:04.263 に答える
0

この特定のケースでは、オーバーロードもオーバーライドも発生しないと思います。オーバーロードとオーバーライドの場合、戻り値の型は同じでなければならないため、この場合、静的バインディングも動的バインディングも発生しません。コンパイラはどのメソッドを呼び出す必要があるかを判断できないため、戻り値の型が異なる場合、メソッドのオーバーロードは不可能です。

于 2016-02-03T05:46:27.703 に答える
-1

クラス A のメソッドadd()は、継承によってクラス B でも使用できるためoverloaded、データ型を からint, intに変更することにより、メソッドはクラスに含まれfloat, floatます。

于 2015-09-11T16:23:55.763 に答える