Polymorphie in Java
Polymorphie des Operators »+«
Die Java -Implementation enthält zwei Programme : Eines für eine numerische Addition mit der Operation [int+int] und eines für eine Zeichenfolgenverkettung mit der Operation [java.lang.String+java.lang.String]. Bei der Übersetzung des Programms legt der Compiler die für einen Operator zu verwendende Operation an Hand der Typen der Operanden fest.
Solch eine Festlegung eines (internen) Programmes an Hand der Typen der Operanden wird als Polymorphie bezeichnet. Sie ist hier sehr schön zu erkennen: Der Operator »+« steht in Java für die numerische Addition oder für die Zeichenfolgenverbindung; die Auswahl erfolgt durch den Typ der Operanden. Entsprechend wird der Operator »+« in Java als ein polymorpher Operator bezeichnet.
Eine solchen polymorphen Operator nennt man auch einen überladenen Operator, und spricht von Operatorüberladung. Der Begriff kommt daher, daß der Operator mit mehr als einer Bedeutung „beladen“ ist, er steht als für mehrere verschiedene Operationen (»[int+int]« beziehungsweise »[java.lang.String+java.lang.String]«).
- Arithmetische Summierung
123 + 456
- Die internen Werte werden mit der Operation [int+int] (numerische Addition) summiert
- «123» [int+int] «456»
- Zeichenfolgenverbindung
"123" + "456"
- Die internen Werte werden mit der Operation [java.lang.String+java.lang.String] (Zeichenfolgenverkettung) verbunden
- «"123"» [java.lang.String+java.lang.String] «"123"»
Ohne Polymorphie würde man für die Zeichenfolgenverbindung einen anderen Operator (wie beispielsweise »&«, »~« oder ».«) verwenden als für die numerische Addition.
Mit Polymorphie verwendet man den gleichen Operator für verschiedene Operationen und legt man durch den Typ der Operanden fest, was genau passieren soll.
Polymorphie in der deutschen Sprache
Auch bei Ausdrücken wie „ein Auto waschen“, „Wäsche waschen“ oder „Geld waschen“ steht das Verb „waschen“ für ganz unterschiedliche konkrete Vorgänge, die vom Typ des Subjekts abhängen. Die Sprache wäre komplizierter, wenn man für jeden dieser Vorgänge ein eigenes Wort festlegen wollte.
Polymorphie des Operators »/«
Auch der binäre Operator »/« ist polymorph. Er steht je nach dem Typ der Operanden für die für die ganzzahlige Division (mathematisch ‹ ∖ ›) oder für die Division mit Nachkommastellen (mathematisch ‹ ∕ ›).
- Ganzzahlige Division
1/2
- Die internen Werte werden mit dem internen Programm »[int/int]« (ganzzahlige Division) dividiert
- «1» [int/int] «1»
- Division mit Nachkommastellen
1./2.
- Die internen Werte werden mit dem internen Programm »[double/double]« (Gleitkommadivision) dividiert
- «1.» [double/double] «1.»
- [0.5]
Polymorphie des Operators »-«
Schon der unäre Operator »-« ist polymorph. Denn da eine ganze Zahl intern anders dargestellt wird als eine Gleitkommazahl, ist auch hier für jeden der beiden Datentypen eine eigenes internes Programm zum Vorzeichenwechsel nötig.
- Vorzeichenwechsel ganzer Zahlen
-1
- Der interne Wert wird von dem internen Programm »[-int]« (Vorzeichenwechsel für int-Werte) verarbeitet
- [-int] «1»
- Der interne Wert wird von dem internen Programm »[-double]« (Vorzeichenwechsel für double-Werte) verarbeitet
- [-double] «1.»
Ohne Polymorphie müßte man für den Wechsel des Vorzeichens eines int-Operanden einen anderen Operator als für den Wechsel des Vorzeichens eines double-Operanden verwenden und beispielsweise »⊟1« aber »⊖1.« schreiben. Auch bei verschiedenen anderen Operatoren müßte man dann jeweils verschiedene Zeichen verwenden. Es könnte aber schwierig werden, sich die vielen dann nötigen Operatorzeichen zu merken.
Typ eines Operatorausdruck
Der Typ eines Operatorausdrucks immer bereits durch den Operator und die Typen der Operanden bestimmt.
Es ist also niemals nötig, einen Ausdruck erst auswerten zu lassen, um dessen Typ zu erfahren.
Beispielsweise ist die Signatur von »-1« »-int«, und jeder Ausdruck mit jener Signatur hat den Typ »int«.
Der Typ eines Ausdrucks ist immer bereits durch den Quelltext bestimmt.
Diskussion der Polymorphie von »+« *
Die Polymorphie ist im Falle der Verwendung des Operators »+« sowohl zur arithmetischen Addition als auch zur Zeichenfolgenverbindung umstritten, da man es in Frage stellen kann, ob man das Verketten von Zeichenketten als eine Art von „Addition“ ansehen darf. Falls dem nicht so wäre, dann wäre es falsch oder schlechter Stil, das Additionszeichen »+« dafür mitzuverwenden. Jedoch könnte man dies dann nur den Gestaltern der Programmiersprache vorwerfen, nicht aber ihren Benutzern (also den Programmierern). Deswegen sollte sich der Leser durch diese Bedenken nicht davon abhalten lassen, die Verkettung mit dem Pluszeichen »+« jederzeit zu verwenden, wenn sie ihm als nützlich erscheint.
Die Kritiker sehen in dem mathematischen Symbol »+« ein Zeichen, das in der Mathematik immer für eine kommutative Operation steht – eine Operation also, bei der die Reihenfolge der Operanden auch vertauscht werden kann, ohne das Ergebnis (die Summe) zu ändern. Sie sagen, daß das Summenzeichen nicht für die Zeichenfolgenverbindung verwendet werden sollte, weil diese nicht kommutativ ist. Dabei übersehen sie aber, daß man das Symbol »+« auch in der Mathematik manchmal für nicht-kommutative Operationen (in Monoiden) verwendet. (Obwohl es Stimmen gibt, die sagen, daß dann ein Multiplikationszeichen bevorzugt wird.) Außerdem ist die Polymorphie mit ihrer „metaphorischen Verwendung“ von Verben ein wichtige Eckpfeiler der objektorientierten Programmierung (wie später im Kurs behandelt werden wird), und daher paßt es zu einer objektorientierten Programmiersprache, diese auch bei Operatoren zu verwenden. Schließlich gibt es in der Praxis keine Probleme mit dieser Überladung des +-Operators.