Java のオーバーロードがわかりません。ポリモーフィズムとの関係は?私にはとても抽象的に思えます。私はJavascript言語から来ましたか?これはJavascriptに当てはまりますか?
4 に答える
オーバーロードとは、同じメソッド名を複数のシグネチャ(仮パラメーター (およびその型) のリスト) で定義できることを意味します。
オーバーロードは、言語によって意味が異なります。Java は厳密に型付けされています (実際には「激しく型付けされている」と言う人もいます)。関数のさまざまなバージョンが存在する可能性があり、コンパイラーは、関数 (メソッド) の呼び出しでパラメーターの型を調べることによって、どのバージョンが意図されているかを判断できることを意味します。
JavaScript はそうではありません。関数への仮パラメータは、関数本体での名前による単なる参照ですが、それ以外は特別なことはなく、任意の関数を任意の引数と任意の数で呼び出すことができます。
一部の言語では、実行時の概念として「オーバーロード」が使用されています。Erlang では、関数のいくつかの代替バージョンから選択するときに重要なのは引数の型ではありません。それは値です。
編集— @MarkoTopolnik は、問題は型システムの「強さ」(または「獰猛さ」:-) ではなく、それがどれほど静的であるかにあると指摘しています。Java は、ほぼすべての場所で型を明示的に宣言することを主張していますが、JavaScript (新しい型付き配列構造の一部を除く) はそうではありません。
クラスに次のメソッドがある場合
public void calculate() {}
以下は、オーバーロードされたバージョンの一部です。(同じ名前に注意してください)
public void calculate(int i) {}
public void calculate(int i, int j) {}
ただし、以下は上記のメソッドのオーバーロードされたものではありません。このメソッドは、戻り値の型だけが元のメソッドと異なります。Java では、署名が同じで戻り値の型が異なるメソッドは許可されていません。
public int calculate(int i) {}
オーバーロードは、1 つのクラスに同じ名前で異なる署名を持つ 2 つのメソッドを持つことを可能にする機能です。
public void foo();
public void foo(int i);
foo()
これで、引数なしで、または 1 つの int 引数を指定してメソッドを呼び出すことができ、さまざまなメソッドが実行されます。
オーバーロードとオーバーライドと混同している可能性があります。オーバーライドは確かにポリモーフィズムに関連しています。これは、基本クラスの機能をサブクラスにオーバーライド (変更) する機能です。たとえばChild extends Base
、両方とも子のメソッドfoo()
がfoo()
Base の実装をオーバーライドする場合などです。同様の機能が実際に JavaScript に存在します。
複数の定義を持つ同じ名前のメソッドは、オーバーロードとして知られています
引数の型や数とは異なる場合があります。
例
import java.io.*;
class demoOverloading
{
int add(int x,int y) //method definition
{
return (x+y);
}
double add(double x,double y) //method definition
{
return (x+y);
}
}
public class JavaApplication4
{
public static void main(String[] args)
{
demoOverloading demo=new demoOverloading(); //creating object for above class
System.out.println("Sum of Integer "+demo.add(10,20)); //calling integer add method
System.out.println("Sum of double "+demo.add(33.44,67.5)); //calling double add method
}
}
上記の例では、同じ名前のaddを持つ 2 つのメソッドがありますが、1 つには int が含まれ、もう 1 つには double 引数が含まれています。このように、異なる引数で作成できます。
また、引数の数に違いが生じる可能性があります..
ありがとうございました