Java unterstützt keine direkte Operatorüberladung, wie sie beispielsweise in C++ implementiert ist. Historisch wurde diese Beschränkung eingeführt, um die Lesbarkeit des Codes zu vereinfachen und Mehrdeutigkeiten zu reduzieren: Bjarne Stroustrup (Schöpfer von C++) und James Gosling (Schöpfer von Java) haben diese Frage diskutiert, und in Java wurde beschlossen, Entwicklern nicht zu erlauben, eigenes Verhalten von Operatoren für ihre Klassen zu definieren.
Das Problem der Operatorüberladung besteht darin, dass übermäßige Freiheit bei der Definition von Arithmetik und Logik für benutzerdefinierte Klassen zu schwer nachverfolgbaren Fehlern und einer schlechten Lesbarkeit des Codes führen kann, insbesondere in großen Teams.
Die Lösung besteht darin, die benutzerdefinierte Operatorüberladung zu verbieten. Dennoch unterstützt Java innerhalb seiner Klassen die Überladung von Methoden (overloading), und das Verhalten von Operatoren kann durch explizit definierte Methoden (z. B. .add(), .equals(), .compareTo() usw.) nachgebildet werden.
Beispielcode:
public class Vector2D { private final int x, y; public Vector2D(int x, int y) { this.x = x; this.y = y; } public Vector2D add(Vector2D other) { return new Vector2D(this.x + other.x, this.y + other.y); } } Vector2D v1 = new Vector2D(2, 3); Vector2D v2 = new Vector2D(1, 4); Vector2D sum = v1.add(v2); // statt v1 + v2
Wesentliche Merkmale:
Kann man in Java den Operator "+" für seine Klasse überladen, um Objekte zu addieren?
Antwort: Nein, Java unterstützt keine benutzerdefinierte Überladung arithmetischer Operatoren für erstellte Klassen. Eine Ausnahme wurde nur für Strings gemacht: Der Operator "+" löst die Verkettung über StringBuilder aus.
Wenn man die Methode equals() definiert, funktioniert der Operator "==" dann wie ein Wertvergleich?
Antwort: Nein, der Operator "==" vergleicht die Referenzen auf Objekte, nicht deren Inhalt. Für einen korrekten Wertvergleich wird die überschriebenen equals() verwendet.
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false System.out.println(a.equals(b)); // true
Gibt es Ausnahmen, in denen der Standardoperator sich für nicht-standardmäßige Klassen besonders verhält?
Antwort: Ein "besonderes" Verhalten in Java wird nur für String mit dem Operator "+" und für primitive Typen (automatische Promotion und Unboxing) implementiert. Für andere Klassen funktionieren Operatoren standardmäßig (d.h. sie werden nicht überladen).
Ein junger Entwickler hat die Klasse Money geschrieben und versucht, zwei Objekte über "==" zu vergleichen, in der Annahme, dass sie nach Werten verglichen werden. Dadurch traten Fehler bei der Gleichheitsprüfung auf, die sich erst in der Produktion zeigten.
Vorteile:
Nachteile:
Im Projekt wurde die eigene Klasse Vector geschrieben, alle arithmetischen Operationen sind explizit implementiert, der Operator == wird für Objekte nicht verwendet, und die Dokumentation beschreibt die Semantik der Methoden.
Vorteile:
Nachteile: