Java でのメソッドのオーバーロード

Java でのメソッドのオーバーロード

Java では、メソッド オーバーロードにより、異なるメソッドが同じ名前を持つことができますが、シグネチャは入力パラメータの数または入力パラメータのタイプ、またはその両方の組み合わせによって異なる場合があります。

Java におけるメソッドのオーバーロードは、次のようにも呼ばれます。 コンパイル時のポリモーフィズム 、静的多態性、または 早期バインディング 。メソッドのオーバーロードでは、親引数と比較して、子引数が最も高い優先順位を取得します。

メソッドのオーバーロードの例

ジャワ




// Java program to demonstrate working of method> // overloading in Java> > public> class> Sum {> > // Overloaded sum(). This sum takes two int parameters> > public> int> sum(> int> x,> int> y) {> return> (x + y); }> > > // Overloaded sum(). This sum takes three int parameters> > public> int> sum(> int> x,> int> y,> int> z)> > {> > return> (x + y + z);> > }> > > // Overloaded sum(). This sum takes two double> > // parameters> > public> double> sum(> double> x,> double> y)> > {> > return> (x + y);> > }> > > // Driver code> > public> static> void> main(String args[])> > {> > Sum s => new> Sum();> > System.out.println(s.sum(> 10> ,> 20> ));> > System.out.println(s.sum(> 10> ,> 20> ,> 30> ));> > System.out.println(s.sum(> 10.5> ,> 20.5> ));> > }> }>

出力

30 60 31.0 

Java でのメソッドのオーバーロードのさまざまな方法

  • パラメータの数を変更する。
  • 引数のデータ型を変更する。
  • メソッドのパラメータの順序を変更する

1. パラメータ数の変更

メソッドのオーバーロードは、別のメソッドに渡すときにパラメーターの数を変更することで実現できます。

上記のメソッドの実装を以下に示します。

ジャワ




// Java Program to Illustrate Method Overloading> // By Changing the Number of Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Method 1> > // Multiplying two integer values> > public> int> multiply(> int> a,> int> b)> > {> > int> prod = a * b;> > return> prod;> > }> > > // Method 2> > // Multiplying three integer values> > public> int> multiply(> int> a,> int> b,> int> c)> > {> > int> prod = a * b * c;> > return> prod;> > }> }> > // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Creating object of above class inside main()> > // method> > Product ob => new> Product();> > > // Calling method to Multiply 2 numbers> > int> prod1 = ob.multiply(> 1> ,> 2> );> > > // Printing Product of 2 numbers> > System.out.println(> > 'Product of the two integer value :'> + prod1);> > > // Calling method to multiply 3 numbers> > int> prod2 = ob.multiply(> 1> ,> 2> ,> 3> );> > > // Printing product of 3 numbers> > System.out.println(> > 'Product of the three integer value :'> + prod2);> > }> }>

出力

Product of the two integer value :2 Product of the three integer value :6 

2. 引数のデータ型の変更

多くの場合、名前は同じでもパラメーターの型が異なるメソッドはオーバーロードされていると見なされます。

上記のメソッドの実装を以下に示します。

ジャワ




// Java Program to Illustrate Method Overloading> // By Changing Data Types of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Multiplying three integer values> > public> int> Prod(> int> a,> int> b,> int> c)> > {> > int> prod1 = a * b * c;> > return> prod1;> > }> > > // Multiplying three double values.> > public> double> Prod(> double> a,> double> b,> double> c)> > {> > double> prod2 = a * b * c;> > return> prod2;> > }> }> > class> GFG {> > public> static> void> main(String[] args)> > {> > Product obj => new> Product();> > > int> prod1 = obj.Prod(> 1> ,> 2> ,> 3> );> > System.out.println(> > 'Product of the three integer value :'> + prod1);> > > double> prod2 = obj.Prod(> 1.0> ,> 2.0> ,> 3.0> );> > System.out.println(> > 'Product of the three double value :'> + prod2);> > }> }>

出力

Product of the three integer value :6 Product of the three double value :6.0 

3. メソッドのパラメータの順序を変更する

メソッドのオーバーロードは、2 つ以上のオーバーロードされたメソッドのパラメーターを再配置することによって実装することもできます。たとえば、メソッド 1 のパラメータが (String name, int roll_no) で、もう 1 つのメソッドが (int roll_no, String name) であり、両方とも同じ名前である場合、これら 2 つのメソッドは異なるパラメータのシーケンスでオーバーロードされていると見なされます。 。

上記のメソッドの実装を以下に示します。

ジャワ




// Java Program to Illustrate Method Overloading> // By changing the Order of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Student {> > // Method 1> > public> void> StudentId(String name,> int> roll_no)> > {> > System.out.println(> 'Name :'> + name +> ' '> > +> 'Roll-No :'> + roll_no);> > }> > > // Method 2> > public> void> StudentId(> int> roll_no, String name)> > {> > // Again printing name and id of person> > System.out.println(> 'Roll-No :'> + roll_no +> ' '> > +> 'Name :'> + name);> > }> }> > // Class 2> // Main class> class> GFG {> > // Main function> > public> static> void> main(String[] args)> > {> > // Creating object of above class> > Student obj => new> Student();> > > // Passing name and id> > // Note: Reversing order> > obj.StudentId(> 'Spyd3r'> ,> 1> );> > obj.StudentId(> 2> ,> 'Kamlesh'> );> > }> }>

出力

Name :Spyd3r Roll-No :1 Roll-No :2 Name :Kamlesh 

正確なプロトタイプが引数と一致しない場合はどうすればよいでしょうか?

優先順位に従って、コンパイラは次の手順を実行します。

  • 型変換ですが、同じファミリー内の(範囲の点で)上位の型に変換されます。
  • 1 つ上位のファミリーへの型変換 (int データ型に使用できる long データ型がない場合は、float データ型が検索されるとします)。
Javaでの型変換

概念を明確にするために例を見てみましょう。

ジャワ




// Demo Class> class> Demo {> > public> void> show(> int> x)> > {> > System.out.println(> 'In int'> + x);> > }> > public> void> show(String s)> > {> > System.out.println(> 'In String'> + s);> > }> > public> void> show(> byte> b)> > {> > System.out.println(> 'In byte'> + b);> > }> }> > class> UseDemo {> > public> static> void> main(String[] args)> > {> > byte> a => 25> ;> > Demo obj => new> Demo();> > > // it will go to> > // byte argument> > obj.show(a);> > > // String> > obj.show(> 'hello'> );> > > // Int> > obj.show(> 250> );> > > // Since char is> > // not available, so the datatype> > // higher than char in terms of> > // range is int.> > obj.show(> 'A'> );> > > // String> > obj.show(> 'A'> );> > > // since float datatype> > // is not available and so it's higher> > // datatype, so at this step their> > // will be an error.> > obj.show(> 7.5> );> > }> }>

出力

./UseDemo.java:46: error: no suitable method found for show(double) obj.show(7.5); ^ method Demo.show(int) is not applicable (argument mismatch; possible lossy conversion from double to int) method Demo.show(String) is not applicable (argument mismatch; double cannot be converted to String) method Demo.show(byte) is not applicable (argument mismatch; possible lossy conversion from double to byte) 1 error 

メソッドのオーバーロードの利点

  • メソッドのオーバーロードにより、プログラムの可読性と再利用性が向上します。
  • メソッドのオーバーロードにより、プログラムの複雑さが軽減されます。
  • メソッドのオーバーロードを使用すると、プログラマはタスクを効率的かつ効果的に実行できます。
  • メソッドのオーバーロードを使用すると、わずかに異なる引数と型で関連する関数を実行するメソッドにアクセスできます。
  • クラスのオブジェクトは、コンストラクターを使用してさまざまな方法で初期化することもできます。

Java に関する重要な質問

Q1.静的メソッドをオーバーロードできますか?

答え:

答えは「 はい 』。同じ名前で入力パラメータが異なる静的メソッドを 2 つ以上持つことができます。たとえば、次の Java プログラムについて考えてみましょう。これについて詳しくは、次の記事を参照してください。 Java で静的メソッドをオーバーロードまたはオーバーライドできますか?

Q2.静的キーワードのみが異なるメソッドをオーバーロードできますか?

答え:

私たちは できない Java で 2 つのメソッドが静的キーワードだけが異なる場合 (パラメータの数とパラメータの型が同じ)、Java で 2 つのメソッドをオーバーロードします。たとえば、次の Java プログラムを参照してください。詳細については、こちらを参照してください。

Q3. Javaでmain()をオーバーロードできますか?

答え:

他の静的メソッドと同様に、 できる Java の main() をオーバーロードします。

ジャワ




// Java program with overloaded main()> import> java.io.*;> > public> class> Test {> > // Normal main()> > public> static> void> main(String[] args)> > {> > System.out.println(> 'Hi Geek (from main)'> );> > Test.main(> 'Geek'> );> > }> > > // Overloaded main methods> > public> static> void> main(String arg1)> > {> > System.out.println(> 'Hi, '> + arg1);> > Test.main(> 'Dear Geek'> ,> 'My Geek'> );> > }> > > public> static> void> main(String arg1, String arg2)> > {> > System.out.println(> 'Hi, '> + arg1 +> ', '> + arg2);> > }> }>

出力

Hi Geek (from main) Hi, Geek Hi, Dear Geek, My Geek 

Q4. Java は演算子のオーバーロードをサポートしていますか?

答え:

C++ とは異なり、Java ではユーザー定義のオーバーロードされた演算子は許可されません。 Java は内部的に演算子をオーバーロードします。たとえば、+ は連結のためにオーバーロードされます。

Q5.戻り値の型でメソッドをオーバーロードできますか?

答え:

戻り値の型によってオーバーロードすることはできません。この動作は C++ でも同様です。詳細については、こちらを参照してください。

ジャワ




/*package whatever //do not write package name here */> > import> java.io.*;> > public> class> Main {> > public> int> foo() {> return> 10> ; }> > > // compiler error: foo() is already defined> > public> char> foo() {> return> 'a'> ; }> > > public> static> void> main(String args[]) {}> }>

エラー

./Main.java:8: error: method foo() is already defined in class Main public char foo() { return 'a'; } ^ 1 error 

ただし、呼び出される関数のデータ型が明示的に指定されている場合は、戻り値の型でメソッドをオーバーロードすることが可能です。以下の例を見てください。

ジャワ




// Java program to demonstrate the working of method> // overloading in static methods> > import> java.io.*;> > public> class> Main {> > > public> static> int> foo(> int> a) {> return> 10> ; }> > public> static> char> foo(> int> a,> int> b) {> return> 'a'> ; }> > > public> static> void> main(String args[])> > {> > System.out.println(foo(> 1> ));> > System.out.println(foo(> 1> ,> 2> ));> > }> }>

出力

10 a 

ジャワ




// Java program to demonstrate working of method> // overloading in methods> class> A {> > public> int> foo(> int> a) {> return> 10> ; }> > > public> char> foo(> int> a,> int> b) {> return> 'a'> ; }> }> > public> class> Main {> > > public> static> void> main(String args[])> > {> > A a => new> A();> > System.out.println(a.foo(> 1> ));> > System.out.println(a.foo(> 1> ,> 2> ));> > }> }>

出力

10 a 

Q6.オーバーロードとオーバーライドの違いは何ですか?

答え:

オーバーロードは、シグネチャが異なるほぼ同じ関数です。 オーバーライド ほぼ同じ関数、同じシグネチャですが、継承を通じて接続された異なるクラスです。

Java でのオーバーロードとオーバーライド

オーバーロードはコンパイラ時のポリモーフィズムの一例であり、オーバーライドは実行時のポリモーフィズムの一例です。

関連記事

  • Java でのメソッドのオーバーロードのさまざまな方法
  • Java でのメソッドのオーバーロードと Null エラー
  • Javaで静的メソッドをオーバーロードまたはオーバーライドできますか?