2014-03-12 27 views
6

Folgendes ist ein Code, wo ich versucht habe, den Wert einer endgültigen Variable zu ändern. Zuerst gibt es "a" und dann "ab" aus. Also, wenn wir den Wert einer endgültigen Variablen ändern können, was ist dann der Vorteil, eine Variable als final zu deklarieren? Was ist dann das letzte Schlüsselwort? Bitte irgendjemand kann mir dabei helfen ?????Können wir den Wert einer endgültigen Variable einer veränderbaren Klasse ändern?

package test_new; 
public class FinalVarValueChange { 
    public static void main(String[] args){ 
     final StringBuffer s=new StringBuffer("a"); 
     System.out.println("s before appending :"+s); 
     s.append("b"); 
     System.out.println("s after appending :"+s);  
    } 
} 
+2

https://stackoverflow.com/questions/2435163/why-can-final-object-be-modified – Brian

Antwort

14

final keinen Grad der Konstanz des Objekts durchzusetzen, auf die ein Verweis Bezug genommen wird (es ist nicht die gleiche wie const in C++).

Wenn Sie eine Variable als final markieren, bedeutet dies, dass Sie dieser Variablen keinen anderen Objektverweis zuweisen können.

Zum Beispiel dieser Code wird nicht kompiliert:

final StringBuffer s=new StringBuffer("a"); 
s = new StringBuffer("another a"); /*not possible to reassign to s*/ 

Es kann nützlich sein, wenn Runnables, Callables und Verriegelungs Idiome verwenden.

1

letzte Variable/Referenz bedeutet, dass Sie dieser Referenz keinen anderen Wert zuweisen können, aber Sie können den Status des Objekts ändern.

Hier legen Sie verändern die StringBuffer Objekt s internen Zustand

+0

ja .we kann nicht neu zuzuweisen, nicht –

1

Der letzte Schlüsselwort stellt sicher, dass die reference, die durch die Variable halten, wird sich nicht ändern. Die state der referenzierten Instanz kann sich ändern. Was Sie wahrscheinlich suchen, ist immutability der referenzierten Instanz. Dies liegt in der Verantwortung der Instanz.

3

final Modifizierer bedeutet, dass Sie Variable nicht ändern können, d. H. Verweis auf Ihr Objekt, d. H. Anderen Wert der gleichen Variablen zuweisen. Sie können jedoch den Status des Objekts selbst ändern.

0

Das 'final' bezieht sich auf die Variable sb, die eine Referenz auf einen StringBuffer ist. Da es endgültig ist, können Sie nicht auf einen anderen StringBuffer verweisen. Sie können jedoch (wie Sie gefunden haben) das StringBuffer-Objekt ändern, auf das sich sb gerade bezieht. Versuchen Sie diesen Code kompilieren

final StringBuffer sb = new StringBuffer(); 
sb.append("abc"); 
sb.append("xyz"); 
sb = new StringBuffer(); 
+0

Dank Leute refernce mir geholfen ... :) – Eagle

5

StringBuffer ist nach seinem Design veränderbar und die Methode append ist nur eine Methode, um den Inhalt zu ändern.

Was letzte Variable in Java bedeutet, ist:

  • Für Objekt, es bedeutet, dass Sie kann kein anderes Objekt dieser Referenz zuweisen, aber es nicht hindert Sie nicht von Aufrufen Methoden dieses Objekts .

  • Für grundlegende Variablen (int, float, boolean usw.), da es hier keine Referenz, Zeiger und Objektmethode gibt, bedeutet dies einfach, dass Sie den Wert der Variablen nicht ändern können.

Nehmen Sie die Folge Codes

final ObjectA objA = new ObjectA(); 

Sie können natürlich wie unten

Methoden dieses Objekts aufrufen
objA.setXXX() //legal for a final variable objA 

Der Nebeneffekt setXXX() ist Methode nicht durch Schlüsselwort final gesteuert Hier.

Aber für die Folge Code

final int a = 123; 

Sie zuordnen können auf jeden beliebigen neuen Wert diese Variablen nicht wie unten

a = 234; //Not legal if a has been defined as a final int variable. 

Aber wenn man es mit Integer wie unten

definieren

Sie können Methoden des Objekts a wie unten

aufrufen
a.xxx() 

Allgemein gesprochen ist die finale Definition für Objekt und Basisvariable unterschiedlich.

+0

Dank Lawrence für detaillierte Beschreibung... – Eagle

Verwandte Themen