Perfect answer Jon Skeet but there is another (little) benefit of final variables.
The compiler will ensure the final variable is set once and only once.
Let's say you have to initialize a variable and the computation of the value is complex (multiple if-then-else within if-then-else). You might write code that does not initialize the variable in some condition (or initialize it twice). Of course, this is a bug. Making the variable final will allow the compiler to check the final variable is set once and only once. So you will know quickly if you have a bug.
As I said, little benefit but still handy.