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.