2017-05-11 1 views
1

Ich weiß, dass leere Variablen werden verwendet, um unveränderliche Objekte in Java dh Objekte, deren Mitglied erstellen kann nicht geändert werden Wie funktioniert die folgenden Codezeilen funktionieren ohne ProblemeBlank endgültige Variablen werden verwendet, unveränderliche Objekte erstellen

import java.util.*; 

class B 
{ 
    int a; 
}  
public class BlankFinal 
{ 
    public static void main(String args[]) 
    { 
     final B b; 
     b=new B(); 
     b.a=1; 

     System.out.println(b.a); 

     b.a=23;   // b object's a member is changed even though b is 
         // blank final 

     System.out.println(b.a); 

    }  
} 
+1

Wenn Ihre Tasche endgültig ist, bedeutet dies, dass Sie sie nicht gegen eine andere Tasche austauschen können. Das heißt nicht, dass du keine Sachen aus der Tasche nehmen oder neue Sachen reinbringen kannst. – khelwood

+0

Schöne Analogie danke –

Antwort

2

Die Tatsache, dass b endgültig ist, verhindert nur, dass Sie b (nach seiner anfänglichen Initialisierung) einen neuen Wert zuweisen. Es verhindert nicht, dass Sie Methoden von B aufrufen, die den Status des Objekts, auf das durch b verwiesen wird, verändern oder die Instanzvariablen des Objekts, auf das durch b verwiesen wird, direkt verändern (d. H. b.a = ...).

1

Der Verweis auf B b ist endgültig und kann nicht geändert werden. Wenn Sie versuchen, den Wert des Datenfelds b.a zu ändern, können Sie dies tun, da dieser Verweis nicht geändert wird.

+1

Fast richtig, aber 'final int a' ohne Initialisierung im Konstruktor wird nicht funktionieren. –

+0

Aber Sie können es außerhalb eines Konstruktors (in BlankFinal) initialisieren, aber Neuzuweisung würde nicht funktionieren. –

+0

Richtig, aber so wie es jetzt steht würde es nicht kompilieren. –

Verwandte Themen