Objektvariablen in Java
In einem Java -Quelltext werden Objektausdrücke (Ausdrücke, deren Typ ein Referenztyp ist) verwendet, um Objekte anzugeben.
Im Grundkurs hatten wir gelernt, daß in Deklarationen von Variablen die Typen »int«, »double«, »boolean« und »java.lang.String« erlaubt sind. Nun können wir dies dahingehend ergänzen, daß an Stelle der eben genannten Typen auch alle anderen Referenztypen, wie beispielsweise »java.io.PrintStream«, zulässig sind.
In der Deklarationsanweisung »final java.io.PrintStream out = java.lang.System.out;« wird der lokale Name »out« vom Typ »java.io.PrintStream« für den Wert »java.lang.System.out« vereinbart.
- Deklarationsanweisung
final java.io.PrintStream out = java.lang.System.out;
Nun kann der Name »out« dann anstelle des Ausdrucks »java.lang.System.out« verwendet werden kann.
- Anweisung mit Verwendung von »out«
out.println( 2 );
Eine Objektname wird also ganz ähnlich deklariert wie ein Name für einen elementaren Wert, nur daß anstelle eines elementaren Typs, wie »int«, nun ein Referenztyp, wie der Typ »java.io.PrintStream«, verwendet wird.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int n = 2; /* 2 ist ein elementarer Wert */
final java.lang.String text = "abc"; /* "abc" ist ein Objekt */
final java.io.PrintStream out = java.lang.System.out; /* java.lang.System.out ist ein Objekt */out.println( n );
out.println( text ); }}transcript
2
abc
Betrachtet man ein Objekt isoliert, so hat es keinen Namen (Objekte sind „anonym“.). Es ist aber möglich, im Quelltext Variablen festzulegen, die ein Objekt enthalten, und dem Objekt auf diese Weisen einen Namen oder mehrere Namen zu geben.
Objekte haben keinen ihnen innewohnenden Namen, können aber in benannten Variablen enthalten sein.
»var«
Das obenstehende Programm kann auch mit »var« geschrieben werden. Die Variablen erhalten dadurch jeweils den Typ des Initialisierungsausdrucks, also jeweils dieselben Typen wie im weiter oben stehenden Programm.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var n = 2;
final var t = "abc";
final var o = java.lang.System.out;o.println( n );
o.println( t ); }}- Protokoll
2
abc
In der Praxis kann »var« ruhig immer verwendet werden, falls der Typ des Initialisierungsausdrucks auch als Typ der Variablen verwendet werden soll. In diesem Kurs wird der Typ häufig auch weiterhin explizit angegeben, um diesen für den Leser zu verdeutlichen.
Einführung von Variablen für Ausdrücke
Das folgende Beispiel zeigt wie eine Variable für einen Ausdruck eingeführt wird. Dabei wird der Ausdruck
- durch einen noch verfügbaren Namen ersetzt und
- jener Name wird dann davor so als Variable definiert, daß sein Typ und Wert wie der Typ und Wert des ersetzten Ausdrucks ist.
- Vor der Einführung einer Variablen (Aufgabe)
java.lang.System.out.println( 2 );
- Nach der Einführung einer Variablen (Lösung)
final int i = 2;
java.lang.System.out.println( i );
Beachten Sie, wie der Programmierer oben den richtigen Typ – nämlich »int« – für die neue Variable festgelegt hat. Auch bei den folgenden Aufgaben ist es wichtig, jeweils den richtigen Typ festzulegen. Im allgemeinen sollte dies der Typ des durch die Variablen ersetzten Ausdrucks sein.
Obwohl nichts dagegen spricht, in der Praxis »var« zu verwenden, soll bei der Bearbeitung dieser Aufgaben zu Übungszwecken auf »var« verzichtet werden.
/ Einführung von Variablen
Führen Sie eine Variable für den Ausdruck »1.2« ein, die innerhalb des gegebenen Blocks deklariert wird. Das heißt, daß hinterher an der bisherigen Stelle des Ausdrucks »1.2« nur noch ein Variablenname stehen soll.
Es soll sich hierbei um einen Refaktor handeln, das heißt, daß der Block hinterher wieder dasselbe machen soll wie vorher. Nach der Überarbeitung soll in den Klammern aber ein Variablenname stehen.
- Vor der Einführung einer Variablen (Aufgabe)
{ java.lang.System.out.println( 1.2 ); }
/ Einführung von Variablen (1)
Führen Sie eine Variable für den Ausdruck »"abc"« ein, die innerhalb des unten angegebenen Blocks deklariert wird. Das heißt, daß hinterher an der bisherigen Stelle des Ausdrucks »"abc"« nur noch ein Variablenname stehen soll.
Es soll sich hierbei um einen Refaktor handeln, das heißt, daß der Block hinterher wieder dasselbe machen soll wie vorher. Nach der Überarbeitung soll in den Klammern aber ein Variablenname stehen.
- Vor der Einführung einer Variablen (Aufgabe)
{ java.lang.System.out.println( "abc" ); }
/ Einführung von Variablen (2)
Führen Sie eine Variable für den Ausdruck »java.lang.Thread.currentThread()« ein, die innerhalb des unten angegebenen Blocks deklariert wird. Das heißt, daß hinterher an der bisherigen Stelle jenes Ausdrucks nur noch ein Variablenname stehen soll.
Als Typ der Variablen soll der Typ des Ausdrucks »java.lang.Thread.currentThread()« verwendet werden.
Es soll sich hierbei um einen Refaktor handeln, das heißt, daß der Block hinterher wieder dasselbe machen soll wie vorher. Nach der Überarbeitung soll in den Klammern aber ein Variablenname stehen.
- Vor der Einführung einer Variablen (Aufgabe)
{ java.lang.System.out.println( java.lang.Thread.currentThread() ); }
/ Übungsaufgabe
Ein Aufruf der statischen Methode »now()« der Klasse »java.time.LocalDate« ergibt ein Objekt der Klasse »java.time.LocalDate« mit dem heutigen Datum. Nennen Sie dieses Objekt »today«.
Ein Aufruf der statischen Methode »of(int,int,int)« der Klasse »java.time.LocalDate« ergibt ein Objekt der Klasse »java.time.LocalDate«, mit dem durch die drei Argumente angegebenem Datum (Jahr, Monat, Tag). Erzeugen Sie auf diese Weise ein Objekt mit dem Datum 2000-01-01 und nennen Sie es »birth«.
Ein Aufruf der statischen Methode »between(java.time.LocalDate,java.time.LocalDate)« der Klasse »java.time.Period« ergibt ein Objekt der Klasse »java.time.Period« mit der Differenz zwischen den beiden Argument vom Typ »java.time.LocalDate«. Rufen Sie diese Methode auf, um die Differenz zwischen »birth« und »today« als Objekt vom Typ »java.time.Period« zu ermitteln und nennen Sie dieses Objekt »diff«.
Ein Objekt vom Typ »java.time.Period« stellt einen Zeitraum dar und enthält eine Methode »getYears()«, welche die ganzen Jahre des Zeitraums ergibt. Rufen Sie die Methode »getYears()« des Objektes »diff« auf, um die Differenz in Jahren zu erhalten und geben Sie das Ergebnis aus.
/ Einführung von Variablen (3) ⃗
Führen Sie eine Variable für den Ausdruck »java.util.logging.Logger.getLogger( "abc" )« ein, die innerhalb des unten angegebenen Blocks deklariert wird. Das heißt, daß hinterher an der bisherigen Stelle jenes Ausdrucks nur noch ein Variablenname stehen soll.
Als Typ der Variablen soll der Typ des Ausdrucks »java.util.logging.Logger.getLogger( "abc" )« verwendet werden.
Es soll sich hierbei um einen Refaktor handeln, das heißt, daß der Block hinterher wieder dasselbe machen soll wie vorher. Nach der Überarbeitung soll in den Klammern aber ein Variablenname stehen.
- Vor der Einführung einer Variablen (Aufgabe)
{ java.lang.System.out.println
( java.util.logging.Logger.getLogger( "abc" )); }
/ Einführung von Variablen (4) ⃗
Führen Sie eine Variable für den Ausdruck in der Zeile mit dem Kommentar ein.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println
(
"alpha[]".replace( "[", "(" ) /* N */
.replace( "]", ")" )); }}- Protokoll
alpha()
/ Einführung von Variablen (5) ⃗
Führen Sie eine Variable für den Ausdruck in der Zeile mit dem Kommentar ein.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println
( "alpha".concat
(
"zeta".concat( "gamma" ) /* N */
)); }}- Protokoll
alphazetagamma
Auflösung von Deklarationen ⃗
Bei den folgenden Übungsaufgaben soll jede Verwendung eines Namens durch den Initialisierungsausdruck der Deklaration jenes Namens ersetzt und die Deklaration danach entfernt werden.
Beispielaufgabe ⃗
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String s = "alpha[]".replace( "[", "(" );
java.lang.System.out.println( s.replace( "]", ")" )); }}
- Protokoll
alpha()
Beispiellösung ⃗
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println
( "alpha[]".replace( "[", "(" ).replace( "]", ")" )); }}- Protokoll
alpha()
/ Übungsaufgabe ⃗
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String u = "gamma".toUpperCase();
java.lang.System.out.println( "alpha".concat( u )); }}
- Protokoll
alphaGAMMA
/ Übungsaufgabe ⃗
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String u = "gamma".toUpperCase();
java.lang.System.out.println( u.concat( "alpha" )); }}
- Protokoll
GAMMAalpha
/ Übungsaufgabe ⃗
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String u = "gamma".toUpperCase();
java.lang.System.out.println( u.concat( u )); }}
- Protokoll
GAMMAGAMMA
Aufruf von Methoden eines Objektes
/ Beispielaufgabe
Rufen Sie die Methode »length()« des Objektes »"abc"« auf! Einmal soll das Objekt ohne Verwendung einer Variablen angegeben werden und einmal durch Verwendung einer Variablen.
- Beispiellösung (erster Teil)
java.lang.System.out.println( "abc".length() );
- Beispiellösung (zweiter Teil)
final java.lang.String s = "abc";
java.lang.System.out.println( s.length() );
/ Übungsaufgabe _
Der Ausdruck »java.util.logging.Logger.getLogger( "abc" )« hat als Wert ein Objekt. Rufen Sie die Methode »info(java.lang.String)« jenes Objektes mit dem Argument »"def"« auf. Dazu soll das Objekt einmal durch den angegebenen Ausdruck angegeben werden und einmal durch einen Namen.
Bei dieser Aufgabe sollten Wertaufrufe (Aufrufe, die einen Wert haben) in runden Klammern hinter »java.lang.System.out.println« geschrieben werden, und Aufrufe ohne Wert direkt vor ein Semikolon »;«.
/ Übungsaufgabe (1) ⃗
Hinweis für den Dozenten ► Die Bearbeitung dieser Aufgabe sollte erst nach der Nachbesprechnung der vorigen Aufgabe erfolgen.
Deklarieren Sie eine Variable, deren Wert das Objekt ist, welches sich als Wert des Aufrufs »java.util.TimeZone.getDefault()« ergibt.
Rufen Sie dann die Methode »setID(java.lang.String)« jenes Objekts mit dem Argument »"ghi"« und danach die Methode »getID()« desselben Objektes auf.
Bei dieser Aufgabe sollten Wertaufrufe (Aufrufe, die einen Wert haben) in runden Klammern hinter »java.lang.System.out.println« geschrieben werden, und Aufrufe ohne Wert direkt vor ein Semikolon »;«.
- Aussprachehinweis
- zone zoʊn