Warum kann eine Methodenreferenz nicht endgültige Variablen verwenden?

Ich hatte einige Verwirrung über innere Klassen und Lambda-Ausdruck, und ich versuchte, ein @ zu fragFrag darüber, aber dann kam ein weiterer Zweifel auf, und es ist wahrscheinlich besser, eine andere Frage zu stellen, als die vorherige zu kommentieren.

Straight to the point: Ich weiß danke Jon) dass so etwas nicht kompiliert

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

aufgrund der Art und Weise, wie Java Schließungen verwaltet, weilone ist nicht [effektiv] final und so weiter

Aber wie kommt es, dass das erlaubt ist?

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

Ist nicht//2 gleichwertig//1? Bin ich im zweiten Fall nicht mit dem Risiko konfrontiert, "mit einer veralteten Variablen zu arbeiten"?

Ich meine, im letzteren Fall nachone = new One(); wird ausgeführtf habe noch eine veraltete Kopie vonone (d. h. verweist auf das alte Objekt). Ist das nicht die Art von Zweideutigkeit, die wir vermeiden wollen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage