Direkte Obertypen in Java (Direkte Obertypen in Java), Lektion, Seite 723211
https://www.purl.org/stefan_ram/pub/direkte_obertypen_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

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):

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.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?

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723211 stefan_ram:723211 Direkte Obertypen in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723211, slrprddef723211, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/direkte_obertypen_java