Java での演算子のオーバーロード
この記事では、Java がユーザー定義の演算子のオーバーロードをサポートするかどうかについて説明します。
Java での演算子のオーバーロード
演算子のオーバーロードは、演算子をユーザー定義型で実装する方法です。渡す引数のタイプと数に基づいてカスタマイズされたロジックを使用します。
演算子のオーバーロードを使用して、ユーザー定義の操作の実装を指定できます。シンタックスシュガーはこれの別の用語です。操作に関与する演算子は、構造体タイプまたはユーザー定義クラスにすることができます。
たとえば、プラス演算子+
を使用して 2つの数値を加算し、2つの文字列を連結するのは、演算子のオーバーロードの最も単純なケースです。
ただし、Java は、plus 演算子を使用した文字列連結という 1つの場合を除いて、演算子のオーバーロードをサポートしていません。
これが完全な例です。
import java.util.Scanner;
public class OperatorOverloading {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
// Input the first string
System.out.println("Enter a string");
String s1 = sc.next();
// Input the second string
System.out.println("Enter another string: ");
String s2 = sc.next();
// Plus operator concatenates the two Strings
System.out.println(s1 + ' ' + s2);
// Input the first integer
System.out.println("Enter a number");
int x = sc.nextInt();
// Input the second integer
System.out.println("Enter another number");
int y = sc.nextInt();
// Plus operator adds the two numbers
System.out.println(x + y);
}
}
出力:
Enter a string
Hello
Enter another string:
World
Hello World
Enter a number
3
Enter another number
4
7
この例では、プラス演算子は 2つの整数を加算し、2つの文字列を連結します。これは、Java がサポートする唯一の演算子オーバーロードです。
これ以外に、Java はユーザー定義の演算子のオーバーロードをサポートしていません。演算子のオーバーロードに近い Java の唯一の部分は、文字列を連結するための+
の処理です。
その結果、定数のコンパイル時の連結または実行時の連結が発生します。ただし、Java では、このように動作する演算子を定義することはできません。
plus 演算子を使用して Java で文字列を連結できますが、Java には concat()
メソッドが組み込まれているため、演算子のオーバーロードを実行する必要がありません。concat()
メソッドは、指定された文字列の最後に別の文字列を追加します。
文字列を指定して、希望する順序で結合された文字列を取得する必要があります。
構文:
String resultant = String1.concat(String2)
最初の文字列の最後に 2 番目の文字列を追加します。以下の例では、concat()
メソッドを使用して 2つの文字列をまとめています。
import java.util.Scanner;
public class OperatorOverloading {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string:");
String s1 = sc.next();
System.out.println("Enter another string:");
String s2 = sc.next();
// Concatenate the two strings using concat() method
String res = s1.concat(s2);
System.out.println(res);
}
}
出力:
Enter a string:
Hello
Enter another string:
World
HelloWorld
ここでは、文字列の連結に plus 演算子を使用していないことに注意してください。また、concat()
メソッドを使用して 2つの文字列を組み合わせることができます。
Java が演算子のオーバーロードをサポートしない理由
ほとんどの組み込み演算子は C++ で再定義できますが、Java では再定義できません。以下の理由によるものです。
- 演算子のオーバーロードにより、コードが複雑になります。Java で演算子をオーバーロードする場合、Java の Java 仮想マシン(JVM)は、特定のステートメントで使用される演算子の実際の機能を見つけるために特別な努力を払う必要があります。処理が非常に複雑になります。
- 演算子のオーバーロードにより、プログラムにエラーが発生します。演算子のオーバーロードは、プログラマーの間で混乱を引き起こします。また、演算子のオーバーロードをサポートする言語を使用すると、他の言語と比較してエラーが発生する可能性があります。Java にはメソッドのオーバーロードがあります。メソッドのオーバーロードは、演算子のオーバーロードの機能を提供し、エラーの範囲を排除します。
- Java はメソッドのオーバーロードをサポートしています。メソッドのオーバーロードは、同じ名前でパラメーターが異なる複数のメソッドを持つクラスの概念です。ここでは、使用するメソッドの識別が簡単です。引数の数または引数のデータ型によって異なります。
例を見てみましょう。
import java.util.*;
// The class which has two methods
class DemoClass {
// This method takes two arguments
static int demo(int a, int b) {
return a + b;
}
// This method takes three arguments
static int demo(int a, int b, int c) {
return a * b * c;
}
}
class MethodOverloading {
public static void main(String[] args) {
// Passing two arguments
System.out.println(DemoClass.demo(10, 12));
// Passing three arguments
System.out.println(DemoClass.demo(11, 10, 10));
}
}
出力:
22
1100
上記の例では、クラス DemoClass
には同じ名前の 2つのメソッド demo
があります。ただし、これら 2つのメソッドは異なる数の引数を取ります。
2つの引数を渡すと、最初のデモメソッドが実行され、3つの引数を渡すと、2 番目のデモメソッドが実行されます。これは、Java でメソッドのオーバーロードがどのように機能するかです。
言語を単純にするために、Java の開発者は演算子のオーバーロード機能を提供していませんでした。すべての演算子には、開発者の要件に応じて変更できるという意味があります。
複数の人が同じプロジェクトに取り組んでいると、混乱を招きます。Java 設計者は、演算子の使用を避けるために、Java での演算子のオーバーロードを回避しました。これにより、Java は実装が簡単な言語になります。
JVM ベースの言語としても知られるいくつかの Java に似た言語は、演算子のオーバーロードをサポートします。これらには、Groovy と Kotlin が含まれます。
Jetbrains によって開発された Kotlin は、高レベルで静的に型付けされた言語です。Java 仮想マシンまたは JVM で実行され、Javascript ソースコードにコンパイルすることもできます。
Java に対する Kotlin の主な進歩の 1つは、Java とは異なり、Kotlin が演算子のオーバーロードをサポートしていることです。
一方、Groovy は静的型付けと動的型付けの両方をサポートし、Java 仮想マシンのバイトコードにコンパイルします。Groovy は、演算子のオーバーロードもサポートしています。
まとめ
Java が演算子のオーバーロードをサポートしているかどうかの答えとして、Java は演算子のオーバーロードをサポートしていません。Java の一部のみがこの概念に似ています。plus 演算子を使用した文字列の連結です。
これ以外に、Java では演算子を定義できません。ただし、Java などの他のいくつかの JVM ベースの言語は、演算子のオーバーロードをサポートしています。
これらには、Groovy と Kotlin が含まれます。しかし、これらは Java と同じではありません。