3 Stimmen

Was ist Operatorüberladung und wie unterscheidet sie sich von Polymorphismus?

Ich programmiere in Java und habe versucht zu verstehen, was genau Operatorüberladung ist. Ich bin immer noch ein bisschen verwirrt.

Ein Operator kann verschiedene Bedeutungen annehmen, je nachdem, welche Klasse ihn verwendet? Ich habe gelesen, dass es sich um "Namenspolymorphismus" handelt.

Java unterstützt dies offenbar nicht, und es scheint eine Menge Kontroversen darüber zu geben. Sollte ich mir darüber Sorgen machen?

Als letzte Frage, in einer Aufgabe hat der Lehrer angegeben, dass die Aufgabe Operator-Überladung verwendet, er ist ein C++-Programmierer hauptsächlich aber wir sind erlaubt, die Aufgabe in Java zu schreiben.

9voto

Radu Murzea Punkte 10364

Operatorüberladung bedeutet im Grunde, dass man denselben Operator für verschiedene Datentypen verwendet. Und dadurch ein unterschiedliches, aber ähnliches Verhalten zu erhalten.

Java unterstützt dies zwar nicht, aber in jeder Situation, in der so etwas nützlich sein könnte, kann man es in Java leicht umgehen.

Der einzige überladene Operator in Java ist der arithmetische + Betreiber. Bei Verwendung mit Zahlen ( int , long , double usw.), fügt es sie hinzu, so wie man es erwarten würde. Bei Verwendung mit String Objekte, so werden sie verkettet. Zum Beispiel:

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

Dies würde folgendes auf dem Bildschirm ausgeben: This is a String .

Dies ist die einzige Situation in Java, in der man von Operatorüberladung sprechen kann.

Zu Ihrer Aufgabe: Wenn die Anforderung darin besteht, etwas zu tun, das die Überladung von Operatoren beinhaltet, können Sie dies in Java nicht tun. Fragen Sie Ihren Lehrer, welche Sprache Sie für diese Aufgabe verwenden dürfen. Wahrscheinlich müssen Sie die Aufgabe in C++ lösen.

PS: Im Falle von Integer , Long , Double usw., würde es auch wegen des Unboxings funktionieren.

3voto

JB Nizet Punkte 654813

Java erlaubt keine Überladung von Operatoren. Es verwendet jedoch eine sehr begrenzte Art von Operatorüberladung, da + führt je nach Kontext Addition oder Verkettung durch.

Wenn Sie in Ihrer Aufgabe aufgefordert werden, etwas durch Überladen von Operatoren zu implementieren, können Sie dies nicht in Java tun. Vielleicht sollten Sie den Lehrer fragen, warum er Java für eine solche Aufgabe zulässt.

Wenn Sie in Ihrer Zuweisung nur aufgefordert werden, einen überladenen Operator zu verwenden, dann muss Ihr Programm + für die Verkettung und Addition geeignet. Aber ich würde den Lehrer fragen, denn ich bezweifle, dass es das ist, was er erwartet.

1voto

duffymo Punkte 298898

Java unterstützt es offenbar nicht und es scheint eine Menge von Kontroverse darüber zu geben.

Es gibt keine Kontroverse über dieses Thema. Manche mögen mit der Entscheidung nicht einverstanden sein, aber James Gosling und andere haben sich vom ersten Tag an dafür entschieden, die Überlastung der Betreiber von Klassenentwicklern aus der Sprache. Das wird sich wahrscheinlich nicht ändern.

Wie von anderen hier erwähnt, haben sie sich das Recht vorbehalten, dass die JVM in begrenztem Umfang Operatoren überlasten kann. Der Punkt ist, dass Sie das nicht tun können, wenn Sie Ihre eigenen Klassen entwickeln.

Sie taten dies, weil es Beispiele von C++-Entwicklern gab, die diese Fähigkeit missbrauchten (z. B. Überladen des Punktoperators).

Sollte ich mir darüber Sorgen machen?

Nein. Java wird nicht explodieren. Sie werden nur nicht in der Lage sein, dies für Ihre Klassen zu tun. Wenn Sie das Gefühl haben, dass Sie es brauchen, müssen Sie einfach C++ oder eine andere Sprache schreiben.

0voto

classicjonesynz Punkte 3872

Kann entweder natural a != b (a ist nicht gleich b) oder a.Equals(b) verwenden

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

Aber Java hat einen begrenzten Satz von Operator-Überladung als andere Sprachen http://en.wikipedia.org/wiki/Operator_overloading

0voto

Sid Punkte 7295

Zu Ihrer Frage nach dem Unterschied zwischen Operatorüberladung und Polymorphismus. Polymorphismus ist ein Standard-OOP-Konzept, bei dem eine Instanz einer Klasse je nach zugrunde liegendem Typ unterschiedliche Eigenschaften aufweisen kann. Zum Beispiel in 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();

Folglich weist s Polymorphismus auf.

Das ist etwas anderes als das Überladen von Operatoren, aber das wurde Ihnen bereits in den anderen Antworten erklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X