Historisch gesehen ermöglichten einige Sprachen (z. B. C++), das Programmieren die Überladung von Standardoperatoren (operator overloading), um benutzerdefinierte Datentypen "natürlicher" im Gebrauch zu machen. In Java wurde beim Entwurf der Sprache entschieden, die Operatoren nicht zu überladen, um gegen übermäßige Komplexität und schwer lesbaren Code zu kämpfen.
Das Problem ist, dass es manchmal wirklich praktisch wäre, für seine Objekte das Verhalten von Operatoren zu definieren, z. B. + zum Addieren von Vektoren, aber das ist in Java auf syntaktischer Ebene nicht zulässig.
Die Lösung ist, gewöhnliche Methoden (z. B. add, multiply) für die Arbeit mit Objekten zu definieren oder Standardansätze zu verwenden: Überladen der Methoden equals() und compareTo() zum Vergleichen; oder anwenden von Entwurfsmustern (z. B. das Muster "Builder" oder "Composite").
Beispielcode:
public class Vector { private int x, y; public Vector(int x, int y) { this.x = x; this.y = y; } public Vector add(Vector other) { return new Vector(this.x + other.x, this.y + other.y); } @Override public String toString() { return "Vector(" + x + ", " + y + ")"; } } Vector v1 = new Vector(1, 2); Vector v2 = new Vector(3, 4); Vector sum = v1.add(v2); // "Vector(4, 6)"
Schlüsselfunktionen:
Kann man in Java den Operator == für eigene Klassen so "überladen", dass er Werte und nicht Referenzen vergleicht?
Nein, der Operator == vergleicht immer Referenzen für Objektklassen. Um Werte von Objekten zu vergleichen, muss man equals() überladen und überall dort verwenden, wo logische Äquivalenz wichtig ist.
Kann man irgendwie das Verhalten "a + b" für eigene Klassen erzeugen?
Nur über gewöhnliche Methoden, zum Beispiel a.add(b). Die Syntax der Operatorüberladung wie in C++ wird nicht unterstützt.
Verhalten Strings (String) nicht wie ein überladener Operator '+' in Java?
Tatsächlich funktioniert die Verkettung von Strings mit + nur für den Typ String und wird auf Compiler-Ebene unterstützt – das ist eine besondere Regel der Syntax.
Ein Entwickler verwendet == zum Vergleichen von zwei Punkten in der Klasse "Punkt" und erwartet, dass der Vergleich true ergibt, wenn die Koordinaten übereinstimmen.
Vorteile:
Nachteile:
Ein Entwickler implementiert die Methode equals() zum Vergleichen des Inhalts von Punkten und verwendet zur Addition die Methode add().
Vorteile:
Nachteile: