请告诉我Java中是否可以重载运算符?如果它在 Java 中的任何地方使用,请告诉我。
不,Java不支持用户定义的运算符重载。 Java 唯一接近“自定义”运算符重载的方面是对字符串的 + 处理,这会导致常量的编译时连接或使用 StringBuilder/StringBuffer 的执行时连接。但您无法定义自己的运算符,它们的作用方式相同。
对于支持运算符重载的类似 Java(和基于 JVM)的语言,您可以查看 Kotlin 或 Groovy。或者,您可能会发现 Java 编译器插件解决方案很幸运。
String concat = "one" + "two";
但是,您
不能定义自己的运算符重载。
+
对于字符串重载之外,
-
对于浮点和整数运算也重载,就像
*
和
/
一样。[编辑]
%
对于浮点也是重载的,这对于那些具有 C 或 C++ 背景的人来说可能有点令人惊讶。
也许这是题外话,但我想对我在一些答案中读到的一些内容发表评论。
关于可读性。
比较:
哪一个更具可读性?
因此 Java 打破了通用编程的基本原则:
我们应该能够将内置类型的对象与用户定义类型的对象互换。
(您可能想知道:“他有说‘内置对象’吗?”。是的,
参见这里。)
关于字符串连接:
数学家使用符号 + 进行集合的交换运算。
所以我们可以确定a + b = b + a。
字符串连接(在大多数编程语言中)不尊重这种常见的数学符号。
a := "hello";
b := "world";
c := (a + b = b + a);
或者用Java:
String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);
额外:
请注意,在 Java 中,相等性和同一性是如何混淆的。
==(相等)符号的含义是:
一个。原始类型的平等。
b.对用户定义类型进行身份检查,因此,我们被迫使用
function equals() 来实现相等性。
但是...这与运算符重载有什么关系?
如果语言允许运算符重载,则用户可以为相等运算符赋予正确的含义。
但是,有
一个例外。 + 和 += 对于 String 对象是重载的。
Java运算符重载。它有其自身的局限性,但如果您确实想使用运算符重载,则值得尝试。
package com.example;
@SuppressWarnings("all")
public class Test {
protected int wrapped;
public Test(final int value) {
this.wrapped = value;
}
public int operator_plus(final Test e2) {
return (this.wrapped + e2.wrapped);
}
}
package com.example
class Test2 {
new() {
val t1 = new Test(3)
val t2 = new Test(5)
val t3 = t1 + t2
}
}
官方网站上有每个运营商要实施的方法列表!
Groovy 并重载这些函数来实现您想要的
//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...
class Fish {
def leftShift(Fish fish) {
print "You just << (left shifted) some fish "
}
}
def fish = new Fish()
def fish2 = new Fish()
fish << fish2
谁不想成为/使用 groovy? :D
不,您不能以同样的方式在 Java 中使用已编译的 groovy JAR。它仍然是 Java 的编译器错误。
我们可以以
+
(加号)为例:
int a = 2 + 4;
string = "hello" + "world";
这里,plus 将两个整数相加并连接两个字符串。所以我们可以说Java支持内部运算符重载,但不支持用户定义。