【问题标题】:Java equivalent for C++ operator overloadingC++ 运算符重载的 Java 等效项
【发布时间】:2014-04-27 21:04:30
【问题描述】:

考虑类

public class Complex 
{
    private double x;
    private double y;

    public Complex(double x , double y)
    {
        this.x = x;
        this.y = y;
    }
}

表示复数 x + y*i ,其中 i 是虚数部分。

我有以下主要内容:

public static void main(String args[])
{
    Complex p1 = new Complex(1 , 2);   // ok 
    Complex p2 = new Complex(3 , 4);   // ok 
    Complex p3 = p1 + p2;   // Not ok , doesn't compile 
} 

第三行Complex p3 = p1 + p2; 不编译,因为没有运算符重载 在 Java 中。它可以在 C++ 中工作。

有什么办法(在 Java 中)?

非常感谢

【问题讨论】:

标签: java operator-overloading


【解决方案1】:

在 Java 中无法实现运算符重载。相反,您需要做的是实现操作的方法。

BigDecimal 是一个很好的例子,说明在 Java 中应该如何做到这一点:

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

请注意,BigDecimal 是一个不可变的类,当您在 C++ 中拥有这样的运算符重载的类时,这通常是一个非常好的主意。它使代码更简洁,易于维护。

【讨论】:

    【解决方案2】:

    不是真的没有。由于各种原因,Java 不支持运算符重载。你可以只提供一个 add 方法或类似的东西。

    【讨论】:

      【解决方案3】:

      Java 中没有像 C/C++ 世界中那样的运算符重载,因此仅使用 + 运算符原始数字(byteshortintlongfloatdouble)增量操作。

      这就是说,当您发现 + 运算符在 String 类中被重载的特殊情况时,您不应该抱怨或感到惊讶。

      String s1 = "Hello ";
      String s2 = "World";
      String helloWorld = s1 + s2;
      

      看看上面代码的最后一行,它是完全合法的,并且会产生一个串联的String,编译器永远不会抱怨它。 请记住,这是唯一的例外

      因此,您无需重载某些运算符,而是可以无缝地实现一个处理添加内容的方法:

      public class Complex 
      {
        private double x;
        private double y;
      
        public Complex(double x , double y)
        {
          this.x = x;
          this.y = y;
        }
      
        public Complex add (Complex c) 
        {
          Complex sum = new Complex();
          sum.x = this.x + c.x;
          sum.y = this.y + c.y;
          return sum;
        }
      
      }
      
      public static void main(String args[])
      {
        Complex p1 = new Complex(1 , 2); 
        Complex p2 = new Complex(3 , 4); 
        Complex p3 = p2.add(p1); 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 2019-04-25
        相关资源
        最近更新 更多