什么是运算符重载并且它与多态性不同?

时间:2012-02-07 21:16:24

标签: java polymorphism operator-overloading

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

操作员可以根据哪个班级使用它来承担不同的含义?我读过它是“Name Polymorphism”。

Java显然不支持它,并且围绕这一点似乎存在很多争议。我应该担心吗?

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

5 个答案:

答案 0 :(得分:9)

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

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等对象,它也会因拆箱而起作用。

答案 1 :(得分:3)

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

如果你的作业要求你通过重载操作符来实现某些东西,那么你将无法用Java实现它。也许你应该问老师为什么他允许Java进行这样的任务。

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

答案 2 :(得分:1)

  

Java显然不支持它,似乎有很多   关于这一点的争议。

对此有 no 争议。有些人可能会不同意这个决定,但是James Gosling和其他人从第一天开始就决定让运营商超出类开发人员的语言。它不太可能改变。

正如其他人所指出的那样,他们保留了JVM在有限的基础上超载运营商的权利。关键是你在开发自己的课程时不能这样做。

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

  

我应该担心吗?

没有。 Java不会爆炸。你将无法为你的课程做到这一点。如果你觉得你需要,你只需要编写C ++或其他语言。

答案 3 :(得分:0)

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

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

但是,与其他语言http://en.wikipedia.org/wiki/Operator_overloading

相比,java有一组有限的运算符重载

答案 4 :(得分:0)

关于运算符重载和多态之间差异的查询。多态性是一种标准的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表现出多态性。

这与运算符重载不同,但您已经解释了其他答案中的内容。