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?
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?
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:
Vedere l'articolo di Wikipedia su final in Java per esempi su ciascun caso.
Ricorda che "final" riguarda anche la pubblicazione sicura su altri thread, tuttavia (vedi la mia risposta sotto). –
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.
Ricordate che Java final keyword serve a due scopi, in questo caso:
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
"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.
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
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
È il riferimento alla stringa che è fatto finale qui, non la stringa stessa. –