Direkte Obertypen in Java
Kenntnisse über direkte Obertypen helfen dabei, zu verstehen, wie Klassen verwendet werden können. Die genaue Bedeutung direkter Obertypen wird aber erst im Laufe dieses Kapitels klar werden. Zunächst müssen wir erst einmal lernen, was ein direkter Obertyp überhaupt ist!
Direkte Obertypen
Die direkten Obertypen eines Typs sind (etwas vereinfacht gesagt):
- die direkte Oberklasse des Typs und
- die direkten Oberschnittstellen des Typs.
An dieser Stelle geht es noch nicht darum zu verstehen, was der Unterschied zwischen der direkten Oberklasse eines Typs und den direkten Oberschnittstellen eines Typs ist. Wir sehen diese Begriffe derzeit nur als Bezeichnungen für bestimmte Auflistungen von Typen an, die man so in der Dokumentation ablesen kann. Es ist daher derzeit nicht nötig, an dieser Stelle des Kurses mehr über direkte Oberklassen und direkte Oberschnittstellen zu wissen.
Direkte Untertypen
Wenn ein Typ O ein direkter Obertyp eines Typs U ist, so nennen wir U auch einen direkten Untertyp von O.
Direkte Obertypen in der Dokumentation finden
In der Dokumentation eines Referenztyps wird seine direkte Oberklasse hinter »extends« angegeben.
In der Dokumentation eines Referenztyps werden seine direkten Oberschnittstellen hinter »implements« angegeben.
Die Angaben hinter »extends« und hinter »implements« in der Dokumentation eines Referenztyps bilden zusammen also die direkten Obertypen jenes Referenztyps.
Auszug aus der Dokumentation der Klasse »java.lang.String« (vereinfacht)
___________________________________________________________________________________
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
Die direkte Oberklasse von »java.lang.String« steht hinter »extends« und ist »java.lang.Object«.
Die direkten Oberschnittstellen von »java.lang.String« stehen hinter »implements« und sind »java.io.Serializable«, »java.lang.Comparable<java.lang.String>« und »java.lang.CharSequence«.
Die direkten Obertypen der Klasse »java.lang.String« sind in Java 8 insgesamt also »java.lang.Object«, »java.io.Serializable«, »java.lang.Comparable<java.lang.String>« und »java.lang.CharSequence«.
- Direkte Obertypen von »java.lang.String«
Object Serializable Comparable CharSequence
<String>
^ ^ ^ ^
| | | |
'--------------:--------------'--------------'
|
String
Erweitern von Klassen ⃗
Da ein Referenztyp zusätzlich zu den Methoden seiner direkten Obertypen auch noch weitere Methoden haben kann, sagt man auch, daß er seine direkten Obertypen erweitere (engl. “extends ”), das heißt, er übernimmt ihre Methoden und fügt unter Umständen noch weitere Methoden hinzu.
Eine Klasse, die ein Untertyp einer anderen Klasse O ist, nennt man auch eine Unterklasse von O.
„Eine Klasse zu erweitern “ bedeutet, eine direkte Unterklasse dieser Klasse zu sein und damit alle Methoden dieser Klasse zu enthalten.
- „Die Klasse U erweitert die Klasse O“ bedeutet:
- Die Klasse U ist eine direkte Unterklasse der Klasse O.
- Die Klasse U enthält damit alle Methode der Klasse O.
- Beispiel zur Erweiterung einer Klasse durch eine andere Klasse
java.io
- Interface »BufferedInputStream«
public class BufferedInputStream
extends FilterInputStream
»extends« kennzeichnet in der Proklamation einer Klasse eine direkte Untertypbeziehung.
Erweitern von Schnittstellen ⃗
Eine Schnittstelle, die ein Untertyp einer anderen Schnittstelle O ist, nennt man auch eine Unterschnittstelle von O.
„Eine Schnittstelle zu erweitern “ bedeutet, eine direkte Unterschnittstelle dieser Schnittstelle zu sein und damit alle Methoden dieser Schnittstelle zu enthalten.
- „Die Schnittstelle U erweitert die Schnittstelle O“ bedeutet:
- Die Schnittstelle U ist eine direkte Unterschnittstelle der Schnittstelle O.
- Die Schnittstelle U enthält damit alle Methode der Schnittstelle O.
- Beispiel zur Erweiterung einer Schnittstelle durch eine andere Schnittstelle
java.io
- Interface »Closeable«
public interface Closeable
extends AutoCloseable- Aussprachehinweis
- closeable ˈclozəbl
»extends« kennzeichnet in der Proklamation einer Schnittstelle eine direkte Untertypbeziehung.
Implementieren von Schnittstellen ⃗
„Eine Schnittstelle zu implementieren “ bedeutet, eine Klasse zu sein und ein Untertyp von dieser Schnittstelle zu sein und damit alle Methoden von dieser Schnittstelle zu enthalten.
- „Die Klasse K implementiert die Schnittstelle S“ bedeutet:
- Die Schnittstelle K ist ein Untertyp der Schnittstelle S.
- Die Klasse K enthält damit alle Methoden der Schnittstelle S.
- Beispiel zur Implementation einer Schnittstelle durch eine Klasse
java.lang
- class »String«
public final class String
implements CharSequence
»implements« kennzeichnet in der Proklamation einer Klasse eine direkte Untertypbeziehung.
Es gibt also einen Unterschied in der Sprachweise: Wenn eine Klasse ein Untertyp einer Klasse oder eine Schnittstelle ein direkter Untertyp einer Schnittstelle ist, so spricht man von einer Erweiterung. Ist aber einer Klasse ein Untertyp einer Schnittstelle, nennt man jene Klasse auch eine Implementation jener Schnittstelle. (Daß eine Schnittstelle Untertyp einer Klasse ist, kommt nicht vor.)
- Untertypbeziehungen
Klasse O Schnittstelle S
^ ^
/ \ / \
| .|
| .' |
| .' |
| .' |
| .' |
erweitert | implementiert | erweitert
| .' |
| .' |
| .' |
| .' |
| .' |
|.' |Klasse K, Schnittstelle U,
Unterklasse von O, Unterschnittstelle von S
Implementation von S
Übungsfragen
? »java.lang.String«
Welche der folgenden Aussagen treffen nach unserem derzeitigen Kenntnisstand zu?
- »java.lang.String« ist ein direkter Obertyp von »java.lang.CharSequence«. (Anton)
- »java.lang.CharSequence« ist ein direkter Obertyp von »java.lang.String«. (Berta)
- »java.lang.Object« ist ein direkter Obertyp von »java.lang.String«. (Cäsar)
- »java.lang.String« ist ein direkter Obertyp von »java.lang.Object«. (Dora)
? »java.lang.Integer«
Welche direkten Obertypen hat die Klasse »java.lang.Integer«?
Zitate *
- Zitat aus der Java Language Specification 8, 4.10.2
“Given a non-generic type declaration C, the direct supertypes of the type C are all of the following:
● The direct superclass of C.
● The direct superinterfaces of C.
● The type Object, if C is an interface type with no direct superinterfaces.”
- Aussprachehinweise
- supertype ˈsupɚ ˈtaɪp
Obertypen *
(Dieser Abschnitt definiert Obertypen mit Hilfe direkter Obertypen.)
Den Übergang von einem Typ T zu seinem direkten Obertyp D nennen wir hier einen Obertypschritt. Dabei nennen wir den Typ T den Ausgangspunkt jenes Schrittes und den direkten Obertyp D den Endpunkt des Schrittes.
Eine Abfolge mehrerer Obertypschritte (mit mindestens null Obertypschritten), wobei der Ausgangspunkt jedes Obertypschrittes (außer dem ersten) gleich dem Endpunkt des vorherigen Obertypschrittes ist, nennen wir einen Obertyppfad.
Wir sagen, daß der Typ T den Typ O als Obertyp hat, wenn es einen Obertyppfad von T zu O gibt (dabei muß jeder Schritt in der Richtung von Ausgangspunkt zum Endpunkt durchlaufen werden).
Daraus folgt mit null Obertypschritten, daß jeder Typ Obertyp seiner selbst ist; mit einem Obertypschritt, daß jeder direkte Obertyp auch Obertyp ist; und mit zwei Schritten, daß jeder direkte Obertyp eines direkten Obertyps auch Obertyp ist (ist D2 ein direkter Obertyp eines direkte Obertyps eine Typs T1, so ist D2 ein Obertyp von T1.)
- Dies können wir mit Eltern und Ahnen vergleichen: Wenn es einen Weg von einer Person P zu einer anderen Person A gibt, bei dem jeder Schritt von einer Person Q zu einem Elter dieser Person Q führt, dann hat die Person P die Person A als Ahn. (Allerdings gilt eine Person normalerweise nicht als Ahn ihrer selbst.)
Beispielsweise ist »java.util.List« ein direkter Obertyp von »java.util.ArrayList«, und »java.util.Collection« ist ein direkter Obertyp von »java.util.List«. Daher umfassen die Obertypen von »java.util.ArrayList« mindestens die folgenden drei Typen: »java.util.ArrayList«, »java.util.List« und »java.util.Collection«.
- »java.util.Collection« ist ein Obertyp von »java.util.ArrayList«
java.util.Collection <--------------.
^ |
| direkter Obertyp |
' |
.-----------------> java.util.List | Obertyp von
| ^ | java.util.ArrayList
| | direkter Obertyp |
| ' |
'---------------- java.util.ArrayList ----------------'
Obertyp von . ^ java.util.ArrayList
java.util.ArrayList | | hat in diesem Diagramm
| | einen direkten Obertyp
| | und drei Obertypen.
| |
'-------'
Obertyp von
java.util.ArrayList
(also von sich selbst)- Aussprachehinweis
- array əˈreɪ (c)
- JLS8, 4.10
- The supertypes of a type are obtained by reflexive and transitive closure over the direct supertype relation
- JLS8, 4.10 (übersetzt)
- Die Obertypen eines Typs erhält man durch reflexiven und transitiven Abschluß der Relation „direkter Obertyp“
- Aussprachehinweise
- supertype ˈsupɚ ˈtaɪp
Wir schreiben auch T <: O, um auszudrücken, daß O ein Obertyp von T ist. Falls T nicht gleich O ist, dann wird O ein echter Obertyp von T genannt, und man schreibt T < O.
Wir wissen schon aus dem Grundkurs, daß der Typ »int« den Typ »double« als Obertyp hat: »int < double«.
Eine (direkte) Oberklasse einer anderen Klasse nennt man auch eine (direkte) Basisklasse jener anderen Klasse.
Man kann aus der Definition entnehmen, daß jede Methode, die in einem Obertyp eines Typs vorkommt, auch im Typ selber vorkommt.
Alle Methoden aller Obertypen eines Typs sind Methoden dieses Typs.
Eine Klasse O, die Obertyp einer Klasse K ist, wird auch als Oberklasse von K bezeichnet.
Eine Schnittstelle O, die Obertyp einer Schnittstelle S ist, wird auch als Oberschnittstelle von S bezeichnet.
Direkte Untertypen ⃗
Wenn O ein direkter Obertyp eines Typs T ist, so sagt man auch, daß T ein direkter Untertyp von O sei.
In der Dokumentation findet man die bekannten direkten Untertypen eines Typs in der Regel unter einer Überschrift, die “Direct Known Subclasses: ” (oder ähnlich) lautet. “Subclass ” ist das englische Wort für „Unterklasse“. Man findet direkte Untertypen aber manchmal auch unter der Überschrift “Known Implementing Classes: ” und man findet Untertypen auch manchmal unter “Known Subinterfaces: ”.
? Übungsfrage ⃗
Ist »java.lang.Comparable<java.lang.String>« ein Untertyp von »java.lang.Comparable<java.lang.String>«?
? »java.io.PrintStream« ⃗
Wie viele Untertypen hat der Referenztyp »java.io.PrintStream« mindestens?
Welche direkte Untertypen dieses Typs kennen Sie?
Welche Untertypen dieses Typs kennen Sie, die keine direkten Untertypen sind?
? »java.lang.String« ⃗
Wie viele Untertypen hat der Referenztyp »java.lang.String«?
Wie viele direkte Untertypen hat der Referenztyp »java.lang.String«?
Wie viele echte Untertypen hat der Referenztyp »java.lang.String«?
Wie viele Untertypen hat der Referenztyp »java.lang.String«, die keine direkten Untertypen sind?