メソッドのオーバーロードとJavaでのオーバーライドの違いは何ですか?


回答:


41

メソッドを新しいメソッドでオーバーロードするには、新しいメソッドに異なるシグネチャが必要です。つまり、2つのオーバーロードメソッドの名前は同じですが、パラメーターが異なります。次に、2つのオーバーロードメソッドの例を示します。

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

パラメータタイプに基づいて、対応するメソッドが呼び出されます。戻り値の型を変更するだけでは不十分であることに注意してください(これは追加で実行できます)。

メソッドがオーバーライドされると、新しいメソッドは同じシグネチャを持ち、オーバーライドされたメソッドを置き換える場合があります。オーバーライドされたメソッドの例を次に示します。

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

選択は、オブジェクトタイプに基づいて行われます。例えば、

A someA = new B();
someA.someMethod();

呼ぶsomeMethodのをB。@Overrideアノテーションを追加できます(追加する必要があります)。

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

これで、Bのパラメーターを誤って変更した場合、コンパイラーはsomeMethod()をオーバーライドせずにオーバーロードしていることを通知します。


@scarfridge、編集ありがとうございます。
長い

1
@Overrideアノテーションに言及していただきありがとうございます。また、戻り値の型が異なるだけではメソッドはオーバーライドされず、オーバーロードされます。
Daniel Dinnyes 2015年

13

オーバーロード、メソッドの名前は同じですが、パラメーターが異なります。

オーバーライドすると、基本クラスで指定された実装がサブクラスの実装で置き換えられます。


1
これを編集/展開しないでください。簡潔さはポイントです。
NimChimpsky 2014年

7

質問する概念は、Javaチュートリアルで説明されています。

オーバーライドの説明は次のとおりです。

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

メソッドをオーバーライドするサブクラスの機能により、クラスは動作が「十分に近い」スーパークラスから継承し、必要に応じて動作を変更できます。オーバーライドするメソッドは、オーバーライドするメソッドと同じ名前、数、タイプのパラメーター、および戻り値のタイプを持っています。オーバーライドするメソッドは、オーバーライドされるメソッドによって返されるタイプのサブタイプを返すこともできます。これは、共変戻り型と呼ばれます。

メソッドをオーバーライドするとき@Overrideは、スーパークラスのメソッドをオーバーライドすることをコンパイラーに指示するアノテーションを使用できます。なんらかの理由で、コンパイラーがメソッドがスーパークラスの1つに存在しないことを検出した場合、エラーが生成されます。の詳細については@Override注釈を参照してください...

オーバーロードについては、チュートリアルで次のように説明されています。

Javaプログラミング言語はオーバーロードメソッドをサポートしており、Javaは異なるメソッドシグネチャを持つメソッドを区別できます。これは、クラス内のメソッドが異なるパラメーターリストを持っている場合、同じ名前を持つことができることを意味します(「インターフェイスと継承」というタイトルのレッスンで説明するこれにはいくつかの資格があります。

書道を使用してさまざまなタイプのデータ(文字列、整数など)を描画できるクラスがあり、各データタイプを描画するメソッドが含まれているとします。それぞれの方法-例えば、新しい名前を使用するのが面倒でdrawStringdrawIntegerdrawFloat、など。Javaプログラミング言語では、すべての描画メソッドに同じ名前を使用できますが、各メソッドに異なる引数リストを渡すことができます。したがって、データ描画クラスはdraw、という名前の4つのメソッドを宣言し、それぞれに異なるパラメーターリストがあります...

オーバーロードされたメソッドは、メソッドに渡される引数の数とタイプによって区別されます...

コンパイラはそれらを区別できないため、同じ名前、同じ数、同じタイプの引数で複数のメソッドを宣言することはできません。

コンパイラーはメソッドを区別するときに戻り値の型を考慮しないため、戻り値の型が異なっていても、同じシグニチャーを持つ2つのメソッドを宣言することはできません。


注:コードを読みにくくする可能性があるため、オーバーロードされたメソッドは慎重に使用する必要があります。


上記のオーバーロードの説明では、「インターフェースと継承」というタイトルのレッスンで説明されている資格について言及しています。

サブクラスでは、スーパークラスから継承されたメソッドをオーバーロードできます。このようなオーバーロードされたメソッドは、スーパークラスメソッドを非表示にもオーバーライドにもしません。これらは、サブクラスに固有の新しいメソッドです。


2

メソッドのオーバーロードは通常、「入力と出力の数とタイプが異なる、同じ名前の複数の使用可能なメソッドを提供する」と定義されています。概念は通常、さまざまな入力のセットが与えられた場合と同じ基本操作を実行できるようにすることです。たとえば、数値型の2つの値を「追加」できますが、通常、正確な型を知ることが重要です値は、そのタイプの特定の動作を利用または計画できるようにするためのものです。そのため、サポートしたい数値型(またはコレクション)の組み合わせごとにメソッドを定義します。これらのメソッドはすべて同じ名前ですが、「シグネチャ」は異なります。コンパイル時

メソッドのオーバーライドは、通常、「基本クラスで定義された特定のシグネチャを持つメソッドの派生クラスに異なる実装を提供する」と定義されています。メソッドをオーバーライドする理由はたくさんあります。事実上、それらすべてに共通するのは、派生クラスが実行する必要がある追加の知識を持っているということです。これは、基本クラスでは知ることができません。ほとんどのオブジェクト指向言語には、2種類のオーバーライドがあります。オーバーライドすると、基本クラスのメソッドを置き換えることができます。基本クラスのメソッド。通常、違いは、基本クラスの実装を拡張する派生クラスが、オーバーライドするメソッドの実行中のある時点で、基本クラスのオーバーライドされたバージョンのメソッドを呼び出すことです。これにより、クラスをオーバーライドして、基本クラスに含まれる操作の共通領域を「再利用」することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.