Java: What does final mean, and are final variables always immutable?
A final variable can not be changed after it has been initialized.
Example:
class C {
void m() {
final int i = 7;
i = 55;Error: i has already been initialized.
}
}
So final in the example above, makes i immutable.
The exact same rules apply for reference types (Object, String, List, int[] etc). See this example:
class IntBox {
int j = 17;
}
class C {
void m() {
final int i = 7;
final IntBox b = new IntBox();
}
}
This creates the situation depicted below (locations made up, not actual memory layout):
So, both i and b are final. Are both immutable?
Strictly speaking, yes, since neither i nor b can change their value both are immutable. However, when you mention b in everyday conversation, you're rarely talking about the reference it contains, 0x1153, but the object that the reference points to, the IntBox object. Since the j field is not final (i.e. the IntBox object is mutable) most people would say that b is also mutable.
You could think of it as i "as a whole" can not change and is therefore immutable, but b "as a whole" can change and is therefore mutable.