¿Por qué la referencia de método puede usar variables no finales?

Tenía cierta confusión sobre las clases internas y la expresión lambda, e intenté preguntarle a unpregunta sobre eso, pero luego surgió otra duda, y es probable que sea mejor publicar otra pregunta que comentar la anterior.

Directo al grano: lo sé (gracias Jon) que algo como esto no se compilará

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

debido a cómo Java maneja los cierres, porqueone no es[efectivamente] final y así.

Pero entonces, ¿cómo es que esto está 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(); }

No es//2 equivalente a//1? ¿No estoy, en el segundo caso, enfrentando los riesgos de "trabajar con una variable desactualizada"?

Quiero decir, en este último caso, despuésone = new One(); es ejecutadof todavía tengo una copia desactualizada deone (es decir, hace referencia al objeto antiguo). ¿No es este el tipo de ambigüedad que estamos tratando de evitar?

Respuestas a la pregunta(4)

Su respuesta a la pregunta