Die Bedeutung von final-Variablendeklarationsanweisungen in Java
Bei der Ausführung einer final-Variablendeklarationsanweisung, die alle Anforderungen an eine solche Anweisung erfüllt, wird die darin enthaltene final-Variablendeklaration umgesetzt.
Die Umsetzung einer final-Variablendeklaration legt den Typ, den Namen und den Wert einer final-Variablen fest.
- Der Typ der Variablen wird durch den in der Deklaration angegebenen Typ festgelegt.
- Der Name der Variablen wird durch den in der Deklarations angegebenen Bezeichner festgelegt.
- Bei der Ausführung einer Variablendeklarationsanweisung wird ihr Ausdruck (der rechts vom Gleichheitszeichen befindliche Initialisierungsausdruck) ausgewertet. Der Wert der final-Variablen wird durch den Wert dieser Auswertung des in der Deklaration angegebenen Ausdrucks festgelegt.
Danach kann der Name der final-Variablen als Wertausdruck mit dem festgelegten Typ und Wert verwendet werden. Der Name, der Typ und der Wert einer final-Variablen sind nicht veränderlich.
Die Festlegung des Wertes einer Variablen in einer Variablendeklaration wird auch als Initialisierung (der Konstanten) bezeichnet. Unter Initialisierung versteht man die erste Festlegung des Wertes eines Namens. Es handelt sich um eine Schreiboperation, bei welcher der Wert des Initialisierungsausdrucks in den Typ der Variablen gewandelt wird und dann in die Variable geschrieben wird.
Die Verwendung eines Namens als Ausdruck nennt man kurz einfach nur Verwendung (des Namens). Es handelt sich hierbei um eine Leseoperation, bei welcher der zuvor in die Variable geschriebene Wert wieder ausgelesen wird.
Wirkungen der Auswertung des Initialisierungsausdrucks
Wenn ein Initialisierungsausdruck einer final-Variablendeklarationsanweisung eine Wirkung hat, so tritt diese bei der Auswertung auch ein. Im folgenden Programm wird die Eigenschaft »user.country« durch die final-Variablendeklarationsanweisung auf »IT« gesetzt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final java.lang.String oldUserCountry =
java.lang.System.setProperty( "user.country", "IT" );java.lang.System.out.println( java.lang.System.getProperty( "user.country" ));
java.lang.System.out.println( oldUserCountry );
java.lang.System.setProperty( "user.country", oldUserCountry ); }}Protokoll
IT
DE
Man beachte, daß Variablen uns jetzt in die Lage versetzen, eine Änderung durch Zurückschreiben des ursprünglichen Wertes (in der letzten Zeile des obigen Programms) wieder rückgängig zu machen.
Kuriositäten *
In dem folgenden Programm wird eine Variable namens »String« deklariert.
An einer Stelle, an der in der Variablendeklaration ein Datentyp erwartet wird, steht der Name »String« dann nicht für diese Variable, sondern für den Datentyp »String«. Es handelt sich also um keine Verwendung der Variablen »String«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int String = 1;
final String s = "1";
java.lang.System.out.println( s + String ); }}Protokoll
11
In dem folgenden Programm wird an einer Stelle, an der eine Anweisung erwartet wird, der Name »System« als die zuvor deklarierte Variable interpretiert.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int System = 1;
System.out.println( System ); }}Protokoll
Main.java:6: error: int cannot be dereferenced
System.out.println( System ); }}
^
1 error
Genauso wird in dem folgenden Programm an einer Stelle, an der eine Anweisung erwartet wird, der Name »java« als die zuvor deklarierte Variable interpretiert.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{final int java = 1;
java.lang.System.out.println( java ); }}Protokoll
Main.java:6: error: int cannot be dereferenced
java.lang.System.out.println( java ); }}
^
1 error