Вопрос по java – Внутренний класс и локальные переменные

14

Почему я должен объявитьlocal variable какfinal если мойInner class определенный в методе должен использовать это?

Пример :

<code>class MyOuter2 {

private String x = "Outer2";

void doStuff() {
    final String y = "Hello World";

    final class MyInner {

        String z = y;

        public void seeOuter() {
            System.out.println("Outer x is "+x);
            System.out.println("Local variable is "+y);
            MyInner mi = new MyInner();
            mi.seeOuter();
        }
    }
}
</code>

}

Почему Строкаy должна быть конечная константа? Как это влияет?

посмотрите, поможет ли это обсуждениеtechtracer.com/2008/04/14/… kosa

Ваш Ответ

6   ответов
0

ует, что конечная переменная всегда инициализируется. Мы получаем ошибку, когда пытаемся использовать локальную переменную без инициализации. использование final гарантирует внутреннему классу, что локальная переменная, которая использовалась, инициализируется.

15

Локальные переменные всегда живут в стеке, метод момента, когда все локальные переменные исчезли.

Но ваши объекты внутреннего класса могут быть в куче даже после того, как метод завершится (скажем, переменная экземпляра удерживает ссылку), поэтому в этом случае он не может получить доступ к вашим локальным переменным, поскольку они пропали, если вы не пометите их как final

3

Я думаю, что это сделано для того, чтобы программист не допустил ошибок. Таким образом, компилятор напоминает программисту, что переменная больше не будет доступна после выхода из этого метода. Это важно с циклом. Представьте себе этот код:

public void doStuff()
{
    InnerClass cls[] = new InnerClass[100];
    for (int i = 0; i < 100; ++i)
    {
        cls[i] = new InnerClass()
        {
            void doIt()
            {
                System.out.println(i);
            }
        };
    }
}

КогдаdoIt() метод называется, что будет напечатано?i изменилось во время зацикливания. Чтобы избежать этой путаницы, вы должны скопировать переменную в локальную переменную или создать переменную final, но тогда вы не сможете выполнить цикл.

1

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

13

эта переменная может измениться до того, как внутренний класс получит к ней доступ. Окончательное это предотвращает.

Error: User Rate Limit Exceededdocs.oracle.com/javase/tutorial/java/javaOO/…
7

что внутренний класс внутри функции фактически делает копию локальной переменной, потому что локальная переменная может быть уничтожена после вызова функции, пока экземпляр локального класса все еще существует. Чтобы две копии локальной переменной всегда имели одно и то же значение (чтобы они казались идентичными), вы должны объявить переменную как final.

Похожие вопросы