我想知道final是否真的“冻结”了它的引用,迫使它的底层对象与通过不同路径(例如,对原始引用)进行的任何重新分配共存。

class ThingHolder{
    Thing thing;
}

class Thing{
    int i=5;
    Thing(int i){
        this.i=i;
    }
}

public static void main(String[] args){
    ThingHolder thingHolder = new ThingHolder();
    thingHolder.thing = new Thing(5);

    final Thing aFinalReference = thingHolder.thing;

    thingHolder.thing = new Thing(6); //will this now coexist with "aFinalReference"?

    //...
}


尽管不再成为aFinalReference的一部分,现在thingHolder仍会像在独立对象中一样继续存在,并且继续引用原始的Thing(即当前int为5的那个),无论现在发生了什么。 thingHolder

最佳答案

final真正的意思是,一旦您分配了aFinalReference,就无法重新分配它。

为了回答您将引用什么的问题,我们将逐步执行以下代码:

public static void main(String[] args){
    ThingHolder thingHolder = new ThingHolder();

    // create a new Thing (we'll call it "Thing5"),
    // and point thingHolder.thing at it

    thingHolder.thing = new Thing(5);

    // thingHolder.thing now points to Thing5

    final Thing aFinalReference = thingHolder.thing;

    // aFinalReference now ALSO points to Thing5

    // create a new Thing (we'll call it "Thing6"),
    // and point thingHolder.thing at it

    thingHolder.thing = new Thing(6);

    // thingHolder.thing now points at Thing6 instead of Thing5
    // aFinalReference, however, still points at Thing5
}


main()的末尾:


thingHolder.thing将指向“ Thing6”
aFinalReference将指向“ Thing5”

08-18 19:57
查看更多