Ergänzungen zu Objekten in Java [] (Ergänzungen zu Objekten in Java), Lektion, Seite 723789
https://www.purl.org/stefan_ram/pub/ergaenzungen_objekte_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

Ergänzungen zu Objekten in Java 

Diese Lektion enthält noch verschiedene Ergänzungen zu schon früher behandelten Themen.

Neue Objekte ohne »new«

Es entsteht manchmal der falsche Eindruck, daß Objekte nur  mit »new« erhalten werden können. Es gibt aber neben Erzeugungsausdrücken auch noch verschiedene andere Arten von Ausdrücken für Objekte.

»java.lang.System.out« – vordefinierte Objektnamen

Das Objekt »java.lang.System.out« wird bereits beim Start eines Programms automatisch angelegt. Es muß daher nicht im Quelltext mit »new« erzeugt werden.

Ein anderes Beispiel ist »java.lang.String.class«, ein Ausdruck für ein Objekt, welches die Klasse »java.lang.String« repräsentiert.

»"abc"« – Objektliterale

Die Werte von String-Literalen sind ebenfalls Objekte und werden beim Start eines Programms automatisch angelegt. Sie müssen daher nicht im Quelltext mit »new« erzeugt werden.

»+« – Erzeugungsoperatoren

Der Operator »+« ergibt in manchen Fällen ein Objekt der Klasse »java.lang.String«, das manchmal erst beim Programmablauf neu erzeugt wird. So kann ein neues Objekt ohne Verwendung von »new« erhalten werden.

Erzeugungsmethoden

Neben den Erzeugungsausdrücken gibt es auch Erzeugungsmethoden, mit denen sie nicht verwechselt werden sollten.

Eine Erzeugungsmethode ist eine Methode, die ein neues Objekt einer Klasse erzeugt und als Ergebnis liefert. Durch Aufruf einer solchen Erzeugungsmethode kann ein neues Objekt ohne Verwendung von »new« erhalten werden. Die Namen »java.lang.String.valueOf« und »java.lang.String.format« wurden schon im Grundkurs vorgestellt.

In dem folgenden Beispiel werden durch Auswertungen der Ausdrücke »java.util.Calendar.getInstance()« drei neue Objekte der Klasse »java.util.GregorianCalendar« erzeugt. Dabei wird kein Erzeugungsausdruck, sondern die Erzeugungsmethode »java.util.Calendar.getInstance()« verwendet.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.util.Calendar calendar = java.util.Calendar.getInstance();
java.lang.System.out.println( calendar.getClass() );
java.lang.System.out.println
( java.util.Calendar.getInstance() == java.util.Calendar.getInstance() ); }}
transcript
class java.util.GregorianCalendar
false
Aussprachehinweis
calendar ˈkæl ən dɚ

Klassen ohne Konstruktoren

Bestimmte Klassen haben keine Konstruktoren. Dies kann beispielsweise dann so veranlaßt werden, wenn die Erzeugung eines Objekts keinen Sinn hat, weil die Klasse beispielsweise nur als Behälter statischer Klassenmethoden dient. So kann beispielsweise kein Objekt der Klasse »java.lang.Math« erzeugt werden.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args ){ new java.lang.Math(); }}
transcript
Main.java:2: error: Math() has private access in Math
{ public static void main( final java.lang.String[] args ){ new java.lang.Math(); }}
^
1 error

Ausführer

Wir können Klassen und Objekte als kleine simulierte Computer ansehen, die Kommandos (Nachrichten) ausführen, aber eine Klasse existiert schon beim Programmstart und kann nicht neu während des Programmablaufs angelegt werden, während neue Objekte mit »new« während des Programmablaufs neu erzeugt werden können.

Klassen und Objekte als Ausführer von Kommandos (Nachrichten)

Ausfuehrer

|
.----------------------'----------------------.
| |

Klasse Objekt

Nicht waehrend des Waehrend des
Programmablaufs Programmablaufs
erzeugbar erzeugbar.

Beispiel: Beispiel:
Thread.dumpStack() new String().length()

Objekte

Erweiterte Definition von „Objekt“:

Ein Objekt ist ein Verzeichnis  von Variablen  und Methoden. Ein Objekt kann im Quelltext durch einen Ausdruck angegeben werden. Ein Objekt hat eine Klasse, die bestimmt, welche Variablen und Methoden es enthält. Während des Programmablaufs können neue Objekte erzeugt werden.

Typregeln

Ausdrücke und Typen (Beispiele)

Ausdruck Typ des Ausdrucks Typ des Objekts

"abc" java.lang.String java.lang.String
java.lang.System.out java.io.PrintStream java.io.PrintStream
java.lang.System.in java.io.InputStream java.io.BufferedInputStream
new java.lang.Object() java.lang.Object java.lang.Object

Typregeln für Zeichenfolgen »"abc"«

Der Typ eines Zeichenfolgenliterals, wie »"abc"«, als Ausdruck ist »java.lang.String«. Der Typ des Wertes (Objekts) eines Zeichenfolgenliterals, wie »"abc"«, ist ebenfalls »java.lang.String«.

Bei der Verwendung eines Exemplarerzeugungsausdrucks »new T ()« prüft der Compiler, ob es in der Klasse »T « einen zu den verwendeten Argumenten passenden Konstruktor gibt.

Typregeln für Exemplarerzeugungsausdrücke »new T ()«

Der Typ eines Erzeugungsausdrucks »new T ()« als Ausdruck ist »T « (hier steht »T « für eine beliebige Klasse). Der Typ des Wertes (Objekts) eines Erzeugungsausdrucks »new T()« ist ebenfalls »T «. Die Bedeutung der Argumentwerte in den Klammern muß der Dokumentation des passenden Konstruktors entnommen werden.

Typregeln für Variablendeklarationen mit Referenztypen »T  y = x;«

Bei der Verwendung einer Deklaration »T  y = x;« prüft der Compiler, ob der Referenztyp »T « ein Obertyp des Typs des Initialisierungsausdrucks »x« ist.

Nach der Deklaration »T  y = x;« ist der Typ von »y« als Ausdruck gleich »T « (hier steht »T « für einen beliebigen Referenztyp). Der Wert (das Objekt) von »y« ist danach das gleiche wie das von »x«, es gilt also hinterher »y == x« und »y.getClass() == x.getClass()«.

Bei der Verwendung einer Zuweisung »y = x;« prüft der Compiler, ob der Typ des auf der linken Seite verwendeten Namens ein Obertyp des Typs des Initialisierungsausdrucks »x« ist.

Typregeln für Zuweisungen mit Referenztypen »y = x;«

Nach einer Zuweisung »y = x;« an eine Variable »y« vom Typ »T « (hier steht »T « für einen beliebigen Referenztyp) hat die Variable »y« (als Ausdruck) weiterhin den Typ »T «. Der Wert (das Objekt) von »y« ist danach das gleiche wie das von »x«, es gilt also hinterher »y == x« und »y.getClass() == x.getClass()«.

Typregeln für Aufrufe nicht-statischer Methoden »o.f()«

Bei der Verwendung eines Aufrufs »o.f()« mit einem Referenzausdruck »o« prüft der Compiler, ob es im Referenztyp des Ausdrucks »o« eine nicht-statische Methode mit einer passenden Signatur gibt.

Zusammengefasste Typregeln

Ausdrücke und Typen (Beispiele)

Ausdruck Typ des Ausdrucks Typ des Objekts

"abc" java.lang.String java.lang.String
java.lang.System.out java.io.PrintStream java.io.PrintStream
java.lang.System.in java.io.InputStream java.io.BufferedInputStream
new T() T T
y nach T y = x T wie bei x
y nach y = x Typ von y wie bei x
f( x ) gemaess Dokumentation gemaess Dokumentation/getClass()

+ Die Wert-Programm-Vereinigung

Main.java

public class Main

{ public static void main( final java.lang.String[] args )

{ final java.awt.geom.Point2D.Double o

= new java.awt.geom.Point2D.Double();

o.y = 12;

java.lang.System.out.println( o.toString() );
java.lang.System.out.println( o ); }}

java.lang.System.out

Point2D.Double[0.0, 12.0]

Point2D.Double[0.0, 12.0]

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 stefanram723789 stefan_ram:723789 Ergänzungen zu Objekten in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723789, slrprddef723789, 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/ergaenzungen_objekte_java