final si può riferire a classe, membro, metodo, variabile locale.
Quando lo riferisci a classe stai dicendo che la classe in questione non puoi estenderla, diciamo che la fai diventare costante non dando la possibilità di aggiungere/modificare funzionalità.
Se ti riferisci ad un metodo, in maniera del tutto analoga, stai dicendo che escludi, per tale metodo, la possibilità di fare un override in una gerarchia di classi, ma in linea di principio la classe puoi ancora usarla come classe base.
Se ti riferisci ad un membro/variabile locale, bisogna fare delle precisazioni: final static indica una costante e deve essere inizializzata contestualmente alla dichiarazione.
Es. public final static Double PIGRECO = 3.14;
indico un valore che non può essere modificato ed usando static sono costretta ad inizializzarlo (a conoscere il valore) in fase di compilazione.
Attento che questo è lecito
codice:
public class Sample {
private final static int value = 5;
private final static int anotherValue = value;
}
visto che quando inizializzi anotherValue hai già specificato il valore di value.
per i membri non statici invece final indica un valore che puoi inizializzare una sola volta:
codice:
class Sample {
private final int val;
Sample (){
val = 0;
}
private void method (final int value){
final int val ;
if (value % 2 == 0){
val = 5;
}else {
val = 6;
}
}
}
come puoi vedere indico che val non può essere modificato, o lo istanzio subito (come faccio per la costante) o lo faccio nel costruttore. Usare entrambi le soluzioni insieme è scorretto, o uno o l'altra.
per i membri spesso l'inizializzazione la fai nel costruttore, perché stai dicendo che il riferimento è costante, il valore non lo conosci a priori e quindi lo deduci in fase di costruzione dell'oggetto.
In maniera del tutto analoga per le variabili locali, guarda il metodo method, ti faccio vedere come posso dichiarare la variabile locale e istanziarla dopo, e la doppia assegnazione vale perché la faccio in un ramo if. L'importante è che non tenti di assegnare 2 volte il riferimento all'interno dello stesso blocco.