Il final
di Java non sostituisce il const
di C. In Java final
può apparire in cinque punti. Attributo, dichiarazioni di parametri formali e variabili e definizioni di classi e metodi. Se si utilizza final
per attributi, variabili o parametri, non è possibile riassegnarli, quindi il compilatore non accetta quanto segue:
final List<String> xs = new ArrayList<>();
xs = new LinkedList<>(); //illegal
Tuttavia, tieni presente che puoi ancora modificare l'oggetto a cui fa riferimento xs
:
final List<String> xs = new ArrayList<>();
xs.add("Hello World");
Come per le classi, final
vieta di ereditare da questa classe. Quindi, anche questo è illegale:
final class A {
}
class B extends A { //illegal
}
E per i metodi final
vieta l'override del metodo in una sottoclasse, quindi quanto segue è illegale.
class A {
final void m() {}
}
class B extends A {
final void m() { System.exit(1); } //illegal
}
Quindi perché qualcuno dovrebbe usare una parola chiave per tre diverse intenzioni? Bene, sono collegati. Se dai un'occhiata a java.lang.String
vedrai che è dichiarato come final
. E poiché non ci sono operazioni in String
che cambieranno il valore dell'istanza puoi tranquillamente supporre che
final String GREETING = "Hello, World!";
definisce una costante.
BTW, const
è anche una parola riservata in Java. Ma non ha semantica e quindi non può essere utilizzata in nessun programma Java.