Yes, it can be changed. Only the references cannot be changed, but its internal fields can be. The following code shows it:
public class Final {
static final Point p = new Point();
public static void main(String[] args) {
p = new Point(); // Fails
p.b = 10; // OK
p.a = 20; // Fails
}
}
class Point {
static final int a = 10;
static int b = 20;
}
Groovy (an alternative JVM language) has an annotation called @Immutable, which blocks changing to a internal state of an object after it is constructed.