Por que a referência de método pode usar variáveis não finais?

Fiquei um pouco confuso sobre classes internas e expressão lambda, e tentei pedir umaPergunta, questão sobre isso, mas surgiu outra dúvida, e é provável que seja melhor postar outra pergunta do que comentar a anterior.

Direto ao ponto: eu sei (obrigado Jon) que algo assim não será compilado

public class Main {
    public static void main(String[] args) {
        One one = new One();

        F f = new F(){      //1
            public void foo(){one.bar();}   //compilation error
        };

        one = new One();
    }
}

class One { void bar() {} }
interface F { void foo(); }

devido à maneira como o Java gerencia os fechamentos, porqueone não é[efetivamente] final e assim por diante.

Mas então, como é que isso é permitido?

public class Main {
    public static void main(String[] args) {
        One one = new One();

        F f = one::bar; //2

        one = new One();
    }
}

class One { void bar() {} }
interface F { void foo(); }

Não é//2 equivalente a//1? Não estou, no segundo caso, enfrentando os riscos de "trabalhar com uma variável desatualizada"?

Quero dizer, no último caso, depoisone = new One(); É executadof ainda tem uma cópia desatualizada deone (ou seja, referencia o objeto antigo). Não é esse o tipo de ambiguidade que estamos tentando evitar?

questionAnswers(4)

yourAnswerToTheQuestion