【问题标题】:What is operator overloading and is it different from Polymorphism?什么是运算符重载,它与多态有什么不同?
【发布时间】:2012-02-07 21:16:23
【问题描述】:

我使用 Java 进行编程,并且一直试图准确理解什么是运算符重载。我还是有点疑惑。

一个运算符可以根据使用它的类而具有不同的含义?我读过它是“名称多态性”。

Java 显然不支持它,而且似乎有很多争议。我应该担心这个吗?

最后一个问题,老师在作业中说作业使用运算符重载,他主要是 C++ 程序员,但我们可以用 Java 编写作业。由于Java不支持重载,有什么我应该注意的吗?

【问题讨论】:

  • 运算符重载不能在Java中完成;它是用 C++ 完成的(尽管其他语言也可能支持它)。基本上,您创建自己的操作员并让他们做任何您想做的事情。您可以重新定义 - 添加 2 个数字而不是减去它们。例如,您可以为复数定义 +。

标签: java polymorphism operator-overloading


【解决方案1】:

运算符重载基本上意味着对不同的数据类型使用相同的运算符。并因此获得不同但相似的行为。

Java 确实不支持这一点,但在任何可能有用的情况下,您都可以在 Java 中轻松解决它。

Java 中唯一重载的运算符是算术+ 运算符。当与数字(intlongdouble 等)一起使用时,它会像您期望的那样添加它们。当与String 对象一起使用时,它将它们连接起来。例如:

String a = "This is ";
String b = " a String";
String c = a + b;
System.out.print (c);

这将在屏幕上打印以下内容:This is a String

这是 Java 中唯一可以谈论运算符重载的情况。

关于你的分配:如果需要做一些涉及运算符重载的事情,你不能在 Java 中做到这一点。确切地询问您的老师,您可以在此特定作业中使用哪种语言。您很可能需要在 C++ 中执行此操作。

PS:如果是IntegerLongDouble等对象,由于拆箱也是可以的。

【讨论】:

    【解决方案2】:

    Java 不允许重载运算符。不过,它使用了一种非常有限的运算符重载,因为 + 会根据上下文进行加法或连接。

    如果您的作业要求您通过重载运算符来实现某些东西,那么您将无法在 Java 中实现。也许你应该问老师为什么他允许 Java 做这样的作业。

    如果您的作业只要求您使用重载运算符,那么让您的程序使用+ 进行连接和加法将符合要求。但我会问老师,因为我怀疑这是他所期望的。

    【讨论】:

      【解决方案3】:

      Java 显然不支持它,而且似乎有很多 有争议。

      关于这个没有争议。有些人可能不同意这个决定,但 James Gosling 和其他人从第一天起就决定将 类开发人员 的运算符重载排除在语言之外。不太可能改变。

      正如这里其他人所指出的,他们保留了 JVM 在有限的基础上重载运算符的权利。关键是你在开发自己的类时不能这样做。

      他们这样做是因为有 C++ 开发人员滥用该功能的例子(例如重载点运算符。)

      我应该担心这个吗?

      没有。 Java不会爆炸。你只是无法为你的课程做这件事。如果您觉得需要,您只需编写 C++ 或其他语言即可。

      【讨论】:

        【解决方案4】:

        关于您对运算符重载和多态性之间区别的查询。多态性是一个标准的 OOP 概念,其中类的实例可能会根据底层类型表现出不同的特征。例如在 C++ 中:

        class Shape {
        ...
        virtual void draw()=0;
        }
        
        class Circle :public Shape {
        virtual void draw() {...draw a circle...}
        }
        
        class Square:public Shape {
        virtual void draw() {...draw a square...}
        }
        
        ..
        
        Shape *s = new Circle();
        s->draw(); // calls Circle::draw();
        s=new Square(); // calls Square::draw();
        

        因此 s 表现出多态性。

        这与运算符重载不同,但您已经在其他答案中解释过。

        【讨论】:

        • 可以说运算符重载是一种更简单的多态形式吗?
        • 恕我直言,不,因为多态性意味着表现出多种形式。我猜函数重载更接近多态性。
        【解决方案5】:

        可以使用自然 a != b(a 不等于 b)或 a.Equals(b)

        b.set(1, 0);
        a = b; 
        b.set(2, 0);
        assert( !a.Equals(b) );
        

        但是java比其他语言有一组有限的运算符重载http://en.wikipedia.org/wiki/Operator_overloading

        【讨论】:

          猜你喜欢
          • 2014-03-16
          • 2020-09-20
          • 1970-01-01
          • 2013-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          相关资源
          最近更新 更多