Festlegung und Verwendung von Namen in Java
Erinnerung an Namen
Wir hatten vordefinierte Namen für Werte schon kennengelernt:
- »java.lang.Math.PI«
- »java.lang.Integer.MAX_VALUE«
In dieser Lektion geht es nun darum, wie in einem Programm neue Namen für einen Wert festgelegt werden.
Festlegung eines Namens
Das folgende Programm zeigt ein Beispiel für die Festlegung eines Namens. Der Name »n« wird darin mit dem Typ ›int‹ und dem Wert von »7« festgelegt. Nach der Festlegung kann der Name als Ausdruck mit dem festgelegten Typ ›int‹ und den festgelegten Wert »7« verwendet werden.
Wir nennen einen solchen Namen auch einen Wertnamen, weil er im wesentlichen ein Name für einen Wert ist.
Nach solch einer Festlegung kann der Name als Ausdruck verwendet werden (also an einer Stelle, an der ein Ausdruck erwartet wird) und hat dann, bei einer Auswertung, den für ihn festgelegten Typ ›int‹ und den für ihn festgelegten Wert »7«. (Dies ist wie bei den schon früher behandelten vordefinierten Namen wie »java.lang.Math.PI«.) Wir nennen solch eine Verwendung eines Namens als Ausdruck auch einfach eine Verwendung des Namens.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println( java.lang.Integer.MAX_VALUE );
java.lang.System.out.println( 7 );final int n = 7; /* Festlegung (Schreiben) */
java.lang.System.out.println( n ); /* Verwendung (Lesen) */java.lang.System.out.println( "n" ); }}
Protokoll
2147483647
7
7
n
Es können auch andere Datentypen, Name oder Werte verwendet werden, wie auch weitere Beispiele zeigen werden.
In dieser Lektion werden erstmals in diesem Kurse Typangaben wie »int« oder »double« auch bewußt innerhalb eines Programms eingesetzt. Zuvor traten sie nur in vorgegebenen Rahmen oder der Dokumentation auf.
Deklarationsanweisungen
Der Quelltext »final int n = 7;« aus dem obigen Programm wird als Deklarationsanweisung bezeichnet. Der Ausdruck hinter dem Gleichheitszeichen (hier: »7«) wird Initialisierungsausdruck oder Initialisierer genannt.
Der Gültigkeitsbereich einer Deklarationsanweisung ist der Bereich des Quelltextes, in dem der deklarierte Bezeichner entsprechend jener Deklarationsanweisung (ohne Qualifikation) verwendet werden kann.
Durch die Deklarationsanweisung »final int n = 7;« wird wird festgelegt, daß im Gültigkeitsbereich der Deklarationsanweisung (vom Initialisierer »7« bis direkt vor dem Ende des die Deklarationsanweisung enthaltenden Blocks) der Name »n«
- den Typ ›int‹ und
- den Wert »7«
haben soll.
An Stelle des Typs ›int‹, des Namens »n« und des Wertes »7« kann auch ein anderer Typ, Name beziehungsweise Wert (aus dem Wertebereich des Typs) angegeben werden. Dann wird durch die Deklarationsanweisung festgelegt, daß der Name den angegebenen Typ und Wert hat, wenn er an einer Stelle verwendet wird, an der ein Ausdruck erwartet wird.
Die Schreiben des Namens an einer Stelle, an der ein Ausdruck erwartet wird, ist eine Verwendung des Namens. Bei solch einer Verwendung im Gültigkeitsbereich einer Deklarationsanweisung hat der Name den durch die Deklarationsanweisung festgelegten Typ und Wert.
- Java
final int n = 7;
- auf deutsch:
- „Deklarationsanweisung zur Festlegung des Namens »n« mit dem Typ ›int‹ und dem Wert »7«“
Man kann solch einen Namen auch als eine Konstante bezeichnen, wenn man betonen will, daß er einen konstanten (unveränderlichen) Wert besitzt. (Dieser Gebrauch ist allerdings fachsprachlich nicht ganz korrekt, da das Wort “constant ” in der Java -Sprachspezifikation nur für bestimmte Namen mit konstanten Werten vorgesehen ist.)
Gleichzeitig steht solch ein Name auch für eine Variable, was sogar die technisch korrekte Bezeichnung darstellt, obwohl die in dieser Lektion vorgestellten Variablen gar nicht variabel (veränderlich) sind.
Das folgende kürzere Programm zeigt noch einmal isoliert die Festlegung und Verwendung eines Namens.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int n = 7; /* Festlegung */
java.lang.System.out.println( n ); /* Verwendung */ }}- Protokoll
7
Schon am Anfang des Kurses wurden Typen, wie ›int‹, ›long‹, »double«, und »java.lang.String«, vorgestellt. Aber erst ab dieser Lektion hier schreiben wir sie auch selber in Programme rein.
»var«
Seit Java 10 kann in einer Variablendeklarationsanweisung »var« an Stelle einer Typangabe verwendet werden. Dann wird der Typ des Ausdrucks hinter dem Gleichheitszeichen verwenden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var n = 7;
java.lang.System.out.println( n ); }}- Protokoll
7
Namen als eine Art von Abkürzung ⃗
Das folgende Programm zeigt die Festlegung eines Namens als eine Art von Abkürzung.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String lkw = "Lastkraftwagen";
java.lang.System.out.println
( "Ein " + lkw + "-Fahrer lebt in seinem Fahrzeug." ); }}transcript
Ein Lastkraftwagen-Fahrer lebt in seinem Fahrzeug.
Man kann sich vorstellen, daß bei der Interpretation des obigen Programms als ein Zwischenschritt der Ausdruck rechts vom Gleichheitszeichen an Stelle des Namens links vom Gleichheitszeichen eingesetzt wird.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println
( "Ein " + "Lastkraftwagen" + "-Fahrer lebt in seinem Fahrzeug." ); }}transcript
Ein Lastkraftwagen-Fahrer lebt in seinem Fahrzeug.
Festlegung eines Namens für die Lichtgeschwindigkeit ⃗
Das folgende Programm zeigt die Festlegung eines Namens für den Zahlenwert der Lichtgeschwindigkeit im Vakuum in der Einheit m/s.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var c = 299792458;
java.lang.System.out.println
( "Die Lichtgeschwindigkeit ist gleich " + c + " m/s." ); }}transcript
Die Lichtgeschwindigkeit ist gleich 299792458 m/s.
Fehlende Festlegungen ⃗
Das folgende Programm zeigt das Verhalten einer Java -Implementation beim Fehlen einer Festlegung für einen Namen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println( "Die goldene Zahl ist gleich " + g ); }}
transcript
Main.java:5: error: cannot find symbol
java.lang.System.out.println( "Die goldene Zahl ist gleich " + g ); }}
^
symbol: variable g
location: class Main
1 error
Weiterleitungen ⃗
Eine Weiterleitung ist eine Konstante, die ihren Wert von einer anderen Konstanten bezieht (und diesen daher „weiterleitet“).
So kann man beispielsweise eine Weiterleitung von »java.lang.Math.PI« (Kreiszahl ‹ π ›) einrichten, die es erlaubt, diesen Wert mit nur zwei Buchstaben zu schreiben und eine vielleicht bevorzugte Kleinschreibung zu verwenden.
Das folgende Programm zeigt die Ausgabe des Umfangs und der Fläche eines Kreises mit einem Radius von drei Metern.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final var pi = java.lang.Math.PI;java.lang.System.out.println
( "Umfang = " + 2 * pi * 3 + " Meter" );java.lang.System.out.println
( "Flaeche = " + pi * 3 * 3 + " Quadratmeter" ); }}- Protokoll
Umfang = 18.84955592153876 Meter
Flaeche = 28.274333882308138 Quadratmeter
Mehrere Konstanten ⃗
Es ist auch möglich, daß in einem Block mehrere Konstanten deklariert und verwendet werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int a = 1;
java.lang.System.out.println( a );
final int b = 4;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
1
1
4
Komplexe Ausdrücke ⃗
Namen dürfen auch für Werte von Ausdrücken festgelegt werden, die mit Operatoren oder Methoden geschrieben sind.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final double x = java.lang.Math.abs( +2 );
java.lang.System.out.println( x ); }}
transcript
2.0
Das folgende Programm zeigt die Festlegung eines Namens für den Zahlenwert der goldenen Zahl, welcher in der Klasse »java.lang.Math« nicht vordefiniert ist.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final double g =( 1 + java.lang.Math.sqrt( 5 ))/ 2;
java.lang.System.out.println( "Die goldene Zahl ist gleich " + g ); }}
transcript
Die goldene Zahl ist gleich 1.618033988749895
Ausdrücke mit anderen Variablen
Es ist auch erlaubt, daß ein Namen für den Wert eines Ausdruck festgelegt wird, der eine Verwendung einer anderen, zuvor deklarierten Variablen enthält.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int a = 1;
java.lang.System.out.println( a );
final int b = 4 + a;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
1
1
5Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final double a = 2; java.lang.System.out.println( a );
final double b = a; java.lang.System.out.println( b );
final double c = a + 1; java.lang.System.out.println( c );
final double d = a + b; java.lang.System.out.println( d ); }}transcript
2.0
2.0
3.0
4.0
Übungsfragen
? Interpretation einer Festlegung ⃗
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var n = 4;
java.lang.System.out.println( n + 1 );
java.lang.System.out.println( n ); }}
? Interpretation einer Festlegung (1) ⃗
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String s = "4";
java.lang.System.out.println( s + 1 ); }}
? Vervollständigung zu einem Programm ⃗
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann?
- Hier wird eine möglichst kurze Lösung gesucht.
Main.txt
public final class Main
{ public static void main( final java.lang.String[] args )
{final __________ k = "2.3";
java.lang.System.out.println( k ); }}
? Vervollständigung zu einem Programm (1) ⃗⃗
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann?
- Hier wird eine möglichst kurze Lösung gesucht.
Main.txt
public final class Main
{ public static void main( final java.lang.String[] args )
{final double __________ = 5.6;
java.lang.System.out.println( x ); }}
? Vervollständigung zu einem Programm (2) ⃗⃗
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann und die Zeile »7.0« ausgibt?
- Hier wird eine möglichst kurze Lösung gesucht.
Main.txt
public final class Main
{ public static void main( final java.lang.String[] args )
{final double x = __________;
java.lang.System.out.println( x ); }}
? Interpretation von Festlegungen (2) ⃗
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int n = 4;
final int m = n + n;java.lang.System.out.println( n + 1 );
java.lang.System.out.println( m + 1 ); }}
? Interpretation von Festlegungen (3)
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int n = 2;
final double x = n / 4;java.lang.System.out.println( n );
java.lang.System.out.println( x ); }}
? Beurteilung von Programmen ⃗
Die beiden folgenden Programme kommen zum selben Ergebnis. Welches gefällt Ihnen besser? Warum?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var laengeInZentimetern = 2.0;
final var zentimeterInMillimetern = 10.0;
final var laengeInMillimetern = laengeInZentimetern * zentimeterInMillimetern;java.lang.System.out.println( laengeInMillimetern ); }}
transcript
20.0
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{java.lang.System.out.println( 2.0 * 10.0 ); }}
transcript
20.0
? Interpretation einer Festlegung (4) ⃗
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int x = 4;
java.lang.System.out.println( java.lang.Math.abs( x )); }}
? Interpretation einer Festlegung (5) ⃗
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var x = 2.7;
java.lang.System.out.println( java.lang.Float.intBitsToFloat( x )); }}
? Wirkung einer Initialisierung
Was gibt das folgende Programm aus?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final var v = java.lang.System.setProperty( "user.country", "IT" );
java.lang.System.out.println( java.lang.System.getProperty( "user.country" ));
java.lang.System.out.println( v ); }}
Übungsaufgaben
/ Verdoppeln einer Zahl
Schreiben Sie in das folgende Programm an die Stelle von »__________« einen Ausdruck, so daß der Wert des Namens »dasDoppelte« das Doppelte des Wertes des Namens »zahl« beträgt! Falls die Deklarationsanweisung »final int zahl = 4;« später in »final int zahl = 5;« verändert wird, soll der Wert von »dasDoppelte« sich automatisch anpassen (und dann «10» betragen).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final var zahl = 4;
final var dasDoppelte = __________;
java.lang.System.out.println( dasDoppelte ); /* sollte 8 ausgeben */ }}
Die ersten vier Zeilen und die letzte Zeile darf bei dieser Aufgabe nicht verändert werden.
/ Deklarationsanweisung einer final-Variablen, 0
Schreiben Sie ein Java -Programm, in welchem in einem Block eine final-Variable vom Typ ›int‹ mit dem Namen »i« und dem Wert »2« deklariert wird. Das Programm soll dann den Wert jener Variablen ausgeben (dazu soll diese Variable ausgelesen werden). (Das Programm soll nichts anderes enthalten oder tun.)
/ Variable ⃖
Schreiben Sie ein Programm, in dem eine Variable mit dem Typ »int« deklariert und mit dem Wert »3« initialisiert wird.
Reserveaufgaben
/ Deklarationsanweisung einer Variablen, 1
Schreiben Sie ein Java -Programm, in welchem eine Variable vom Typ ›int‹ mit dem Namen »k« und dem Wert »21« deklariert wird. Das Programm soll dann einmal den Wert jener Variablen ausgeben (dieser soll dazu vom Programm aus der Variablen ausgelesen werden) und einmal das Doppelte des Wertes jener Variablen (der dazu wieder vom Programm aus der Variablen ausgelesen werden soll). (Das Programm soll nichts anderes enthalten oder tun.)
/ Deklarationsanweisung einer Variablen, 2
Hinweis für den Dozenten ► Diese Reserveaufgabe nur bei Bedarf und erst nach der Nachbesprechung der vorherigen Aufgabe gestellt werden.
Schreiben Sie ein Java -Programm, in welchem in einem Block eine Variable vom Typ »double« mit dem Namen »i« und dem Wert »4.8« deklariert wird. Das Programm soll dann den Wert jener Variablen ausgeben. (Das Programm soll nichts anderes enthalten oder tun.)
/ Deklarationsanweisung einer Variablen, 3
Hinweis für den Dozenten ► Diese Reserveaufgabe nur bei Bedarf und erst nach der Nachbesprechung der vorherigen Aufgabe gestellt werden.
Schreiben Sie ein Java -Programm, in welchem in einem Block eine Variable vom Typ »java.lang.String« mit dem Namen »s« und dem Wert »"abc"« deklariert wird. Das Programm soll dann den Wert jener Variablen ausgeben. (Das Programm soll nichts anderes enthalten oder tun.)