在某些语言中(例如,C++),程序设计允许重载标准运算符(operator overloading),以使用户定义的数据类型在使用上更加“自然”。在 Java 语言设计阶段,决定不重载运算符,以应对代码过于复杂和难以阅读的问题。
问题在于,有时确实希望为自己的对象定义运算符的行为,例如,+ 用于向量相加,但在 Java 的语法层面这是不允许的。
解决方案是定义普通方法(例如,add、multiply)来处理对象,或者使用标准方法:重写 equals() 和 compareTo() 方法来进行比较;或者应用设计模式(例如,"构建者"模式或"组合"模式)。
示例代码:
public class Vector { private int x, y; public Vector(int x, int y) { this.x = x; this.y = y; } public Vector add(Vector other) { return new Vector(this.x + other.x, this.y + other.y); } @Override public String toString() { return "Vector(" + x + ", " + y + ")"; } } Vector v1 = new Vector(1, 2); Vector v2 = new Vector(3, 4); Vector sum = v1.add(v2); // "Vector(4, 6)"
关键特性:
equals()、compareTo() 方法,算术运算使用自定义方法。在 Java 中可以“重载” == 运算符以比较值而非引用吗?
不可以,== 运算符始终比较类对象的引用。要比较对象的值,必须重写 equals() 并在需要逻辑等价的地方使用它。
是否可以以某种方式实现自己类的 "a + b" 行为?
只能通过普通方法,例如 a.add(b)。不支持像 C++ 那样的运算符重载语法。
字符串(String)难道不是表现得像重载了的 + 运算符在 Java 中吗?
实际上,使用 + 进行的字符串连接仅适用于 String 类型,并且是在编译器层面支持的——这是一个特殊的语法规则。
== 运算符能比较对象的值。a + b 的方式为自定义类编写代码,而这种语法是不可行的。equals() 和 hashCode(),这会导致与集合相关的错误。开发者在 “点” 类中使用 == 比较两个点,并期望在坐标相同的情况下返回 true。
优点:
缺点:
开发者实现 equals() 方法以比较点内容,并使用 add() 方法进行相加。
优点:
缺点: