Почему ссылка на метод может использовать не финальные переменные?

У меня было некоторое замешательство по поводу внутренних классов и лямбда-выражений, и я попытался спроситьвопрос об этом, но потом возникло другое сомнение, и, вероятно, лучше опубликовать другой вопрос, чем комментировать предыдущий.

Сразу к делу: знаю (спасибо Джон) что-то подобное не скомпилируется

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(); }

из-за того, как Java управляет замыканиями, потому чтоone не является[эффективно] окончательный и так далее.

Но почему же это разрешено?

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(); }

Не является//2 эквивалентно//1? Не сталкиваюсь ли я во втором случае с риском «работы с устаревшей переменной»?

Я имею в виду, в последнем случае, послеone = new One(); выполняетсяf еще есть устаревшая копияone (т.е. ссылается на старый объект). Разве это не та двусмысленность, которую мы пытаемся избежать?

Ответы на вопрос(1)

Ваш ответ на вопрос