Referenzen und Konstanten in Java
Referenzeffekt: final
final verhindert nicht die Veränderung des Objekts (und seiner Felder), sondern nur, daß der Referenzvariablen o ein neuer Wert (mit »o = …«) zugewiesen wird!
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; /* was dank "final" hier nicht geht ist: o = ... */ java.lang.System.out.println( o.toString() );
java.lang.System.out.println( o ); o.y = 17; /* was dank "final" hier nicht geht ist: o = ... */ java.lang.System.out.println( o.toString() );
java.lang.System.out.println( o ); }}transcript
Point2D.Double[0.0, 12.0]
Point2D.Double[0.0, 12.0]
Point2D.Double[0.0, 17.0]
Point2D.Double[0.0, 17.0]
Referenzeffekt: final bei Referenzvariablen
Man beachte, daß oben eine final-Variable in gewissem Sinne verändert wird!
Die Deklaration einer Konstante für ein veränderliches Objekt ist nur scheinbar ein Widerspruch, denn das Schlüsselwort "final" in der Deklaration drückt aus, daß der Bezeichner "o" sich immer auf das gleiche Objekt bezieht. Die Variable "o" ist also konstant, sie enthält immer die gleiche Referenz —aber das von dieser Referenz referenzierte Objekt selber ist veränderlich.
final java.awt.geom.Point2D.Double o = new java.awt.geom.Point2D.Double(); o.y = 12;
_____
.-' '-.
.' '.
o / \ .-----------------------.
.-. konstante ; java.awt.geom. ; variabler | x | 0,00000000000000 |
|#---------------->| Point2D.Double- |--------------->|-----------------------|
'-' Referenz ; Objekt ; Inhalt | y | 12,0000000000000 |
\ / '-----------------------'
'. .'
'-._____.-'final java.awt.geom.Point2D.Double o = new java.awt.geom.Point2D.Double(); o.y = 12; o.y=17;
_____
.-' '-.
.' '.
o / \ .-----------------------.
.-. konstante ; java.awt.geom. ; variabler | x | 0,00000000000000 |
|#---------------->| Point2D.Double- |--------------->|-----------------------|
'-' Referenz ; Objekt ; Inhalt | y | 17,0000000000000 |
\ / '-----------------------'
'. .'
'-._____.-'