2009-05-17 11 views
23

Qual è la differenza tra le seguenti affermazioniString e Final

String name = "Tiger"; 

final String name ="Tiger"; 

Sebbene la classe String è final classe, perché abbiamo bisogno di creare una stringa variabile "costante" come finale?

+4

È il riferimento alla stringa che è fatto finale qui, non la stringa stessa. –

risposta

48

final in questo contesto significa che la variabile name può essere assegnata solo una volta. Assegnare un diverso oggetto String ad esso genera nuovamente un errore di compilazione.

Penso che la fonte della confusione è che la parola chiave final può essere utilizzato in diversi contesti differenti:

  • classe finale: La classe non può essere sottoclassi.
  • metodo finale: il metodo non può essere sovrascritto.
  • variabile finale: la variabile può essere assegnata solo una volta.

Vedere l'articolo di Wikipedia su final in Java per esempi su ciascun caso.

+0

Ricorda che "final" riguarda anche la pubblicazione sicura su altri thread, tuttavia (vedi la mia risposta sotto). –

1

Stai confondendo immutabile con finale.

La stringa, come Integer e Long, è una classe immutabile in quanto i dati interni sono protetti dalla modifica tramite l'incapsulamento.

Tuttavia, come ha detto Ayman, l'ultima si riferisce al puntatore alla stringa.

2

Ricordate che Java final keyword serve a due scopi, in questo caso:

  • significa che il riferimento non può essere impostato su un altro String-- vale a dire non si può in seguito fare "name = ...";
  • ma soprattutto, significa che il riferimento è correttamente pubblicato ad altri thread (vedi articolo collegato per maggiori dettagli, o opere come Goetz et al, "Java Concurrency in Practice".
+0

Sì, la semantica del finale è molto importante nelle applicazioni di concorrenza, non così nelle normali applicazioni Java, perché i programmatori Java tendono ad abbracciare la mutabilità. – egaga

4

"finale "significa cose diverse nei due casi.

La classe java.lang.String è definitiva. Questo significa che non è possibile ereditare da esso.

La variabile 'nome' è definitiva, il che significa che si puo' t cambiatelo per puntare a un'altra istanza di String. Quindi una variabile String non finale non è una costante, perché potresti leggerla in due tempi diversi e ottenere valori diversi.

Come accade, anche gli oggetti stringa Java sono immutabili. Ciò significa che non è possibile modificare il valore rappresentato da un particolare oggetto String. Confronta questo con un array - puoi sostituire il primo elemento di un oggetto array con un oggetto diverso, ma non puoi sostituire il primo carattere di un oggetto String con un altro carattere. Questo è il motivo per cui String.replace() restituisce una nuova stringa - non può modificare quella precedente.

Uno dei motivi per cui String è final è impedire un'istanza di una sottoclasse di String, che implementa il comportamento mutabile, passata al posto di una stringa.

Ma se è possibile modificare un oggetto particolare e se è possibile assegnare un oggetto diverso a una variabile, sono concetti completamente diversi. Uno è una proprietà di oggetti String e l'altro è una proprietà di variabili String, che sono riferimenti a oggetti String.

2

Dai un'occhiata allo The final word on the final keyword.

String name = "scott"; 
name = "tiger"; // OK 

final String gender = "male"; 
gender = "female"; // won't compile you cannot reassign gender cause it's final 
0

Se una variabile viene contrassegnata come finale allora il valore di tale variabile non può essere modificata cioè parola finale quando utilizzato con una variabile rende una costante. E se provate a cambiare il valore di quella variabile durante il corso del vostro programma, il compilatore vi darà un errore.

NOTA: Se si contrassegna variabile di un tipo di riferimento come definitiva, quella variabile non può fare riferimento a qualsiasi altro oggetto. Tuttavia, è possibile modificare i contenuti dell'oggetto, poiché solo il riferimento stesso è definitivo.

FONTE: Final Keyword in Java

Problemi correlati