Classe interna e variáveis ​​locais

Por que preciso declarar umlocal variable Comofinal se meuInner class definido dentro do método precisa usá-lo?

Exemplo:

class MyOuter2 {

private String x = "Outer2";

void doStuff() {
    final String y = "Hello World";

    final class MyInner {

        String z = y;

        public void seeOuter() {
            System.out.println("Outer x is "+x);
            System.out.println("Local variable is "+y);
            MyInner mi = new MyInner();
            mi.seeOuter();
        }
    }
}

}

Por que a corday precisa ser uma constante final? Como isso afeta?