A `final` variable can’t be reassigned, a `final` method can’t be overridden, and a `final` class can’t be extended. (It does not automatically make an object immutable.)
`final` means “cannot be changed in that dimension”, but the meaning depends on where it’s applied.
Final fields have special visibility guarantees after construction (when the object is safely published). This is why immutable objects with final fields are easier to reason about.
final List<String> xs = new ArrayList<>();
xs.add("a"); // ok (mutating object)
// xs = new ArrayList<>(); // not ok (reassign)