Java 中的運算子過載
本文討論 Java 是否支援使用者定義的運算子過載。
Java 中的運算子過載
運算子過載是如何在使用者定義的型別中實現運算子。它使用基於我們傳遞的引數型別和數量的定製邏輯。
使用運算子過載,我們可以指定使用者定義的操作實現。語法糖是這個的另一個術語。操作中涉及的運算元可以是結構體型別,也可以是自定義類。
例如,使用加號運算子 +
將兩個數字相加並連線兩個字串是運算子過載的最簡單情況。
但是,Java 不支援運算子過載,除了一種情況,即使用加號運算子的字串連線。
這是完整的示例。
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
在此示例中,加號運算子將兩個整數相加並連線兩個字串。它是 Java 支援的唯一運算子過載。
除此之外,Java 不支援使用者定義的運算子過載。Java 中唯一接近運算子過載的部分是處理連線字串的+
。
它導致常量的編譯時連線或執行時連線。但是,在 Java 中,我們不能定義我們的操作符,它們的行為是這樣的。
儘管我們可以使用加號運算子在 Java 中連線字串,但 Java 有一個內建的 concat()
方法,它消除了執行運算子過載的需要。concat()
方法在給定字串的末尾附加另一個字串。
我們應該指定字串以按照我們想要的順序獲取組合字串。
語法:
String resultant = String1. concat(String2)
它將在第一個字串的末尾新增第二個字串。下面的示例使用 concat()
方法將兩個字串放在一起。
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
請注意,在這裡,我們沒有使用加號運算子進行字串連線,我們仍然可以藉助 concat()
方法來組合兩個字串。
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
有兩個同名的方法 demo
。但這兩種方法採用不同數量的引數。
當我們傳遞兩個引數時,第一個演示方法開始起作用,當我們傳遞三個引數時,第二個演示方法開始起作用。這就是方法過載在 Java 中的工作方式。
Java 的開發者為了保持語言的簡單,並沒有提供運算子過載的特性。每個運算子都有一些含義,我們可以根據開發人員的要求進行更改。
當多人在同一個專案上工作時,它會導致混亂。Java 設計者避免在 Java 中過載運算子以避免使用運算子。它使 Java 成為一種易於實現的語言。
一些類似 Java 的語言,也稱為基於 JVM 的語言,支援運算子過載。其中包括 Groovy 和 Kotlin。
Kotlin 由 Jetbrains 開發,是一種高階靜態型別語言。它在 Java 虛擬機器或 JVM 上執行,甚至可以編譯成 Javascript 原始碼。
Kotlin 相對於 Java 的主要進步之一是 Kotlin 支援運算子過載,這與 Java 不同。
另一方面,Groovy 支援靜態和動態型別,並編譯為 Java 虛擬機器位元組碼。Groovy 還支援運算子過載。
まとめ
作為 Java 是否支援運算子過載的答案,Java 不支援運算子過載。Java 只有一部分類似於這個概念:使用加號運算子進行字串連線。
除此之外,Java 不允許你定義運算子。但是,其他一些基於 JVM 的語言,如 Java,支援運算子過載。
其中包括 Groovy 和 Kotlin。但這些與 Java 不同。