Поддерживает ли использование final окончательную исходную ссылку и объект, даже если они переназначены другим путем? - PullRequest
1 голос
/ 25 декабря 2011

Мне интересно, действительно ли 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?

Ответы [ 2 ]

7 голосов
/ 25 декабря 2011

Все, что 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"
2 голосов
/ 25 декабря 2011

Я думаю, вы неправильно понимаете использование финала.Проверьте JLS § 4.5.4 .Как предполагает pst, использование final не влияет на время жизни самой переменной.Объявление переменной как final влияет на ее область видимости, поскольку конечные переменные доступны анонимным классам, которые определены в той же области видимости, что и сама конечная переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...