运算符重载是什么,它和多态有什么不同?

3

我使用Java编程,一直试图理解什么是运算符重载。但仍有些困惑。

一个运算符的含义会因为使用它的类不同而有所不同?我读到过这被称为 "名称多态性"。

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

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


运算符重载不能在Java中实现,但它可以在C++中实现(其他编程语言也可能支持)。基本上,您可以创建自己的运算符并使它们执行任何您想要的操作。您可以重新定义减号(-)以将2个数字相加而不是相减。例如,您可以为复数定义加号(+)。 - Adrian
5个回答

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

3
Java不允许重载运算符。但是它使用一种非常有限的运算符重载,因为+根据上下文执行加法或连接操作。
如果您的作业要求您通过重载运算符来实现某些内容,那么在Java中您将无法完成此操作。也许您应该问问老师为什么允许Java做这样的任务。
如果您的作业只要求您使用重载运算符,则使用+进行连接和加法运算即可。但我建议您询问老师,因为我怀疑这是否符合他的期望。

1
Java 显然不支持它,而且似乎围绕着这个问题存在很多争议。
关于这个问题是没有争议的。有些人可能不同意这个决定,但 James Gosling 和其他人从一开始就决定将运算符重载由类开发人员排除在语言之外。这不太可能改变。
正如其他人在这里指出的那样,他们保留了 JVM 有限地重载运算符的权利。关键是当你开发自己的类时不能这样做。
他们这样做是因为有 C++ 开发人员滥用了这种能力(例如重载点运算符)。

我应该担心这个问题吗?

不需要。Java 不会爆炸。你只是不能为你的类做到这一点。如果你觉得需要,你只需编写 C++ 或其他语言即可。

0

可以使用自然语言 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


0
关于您关于运算符重载和多态性之间差异的查询。多态性是一种标准的面向对象编程概念,其中类的实例可能显现出不同的特征取决于底层类型。例如,在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展示了多态性。 这与运算符重载不同,但在其他答案中已经解释过了。

运算符重载是多态的一种简化形式,这种说法正确吗? - Snorkelfarsan
在我看来,多态并不是指展示多种形式。函数重载更接近于多态,我想。 - Sid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接