Доступность членов класса верхнего уровня во внутреннем классе? - PullRequest
0 голосов
/ 05 июня 2011

У меня есть запрос относительно доступности класса верхнего уровня из внутреннего класса члена.Я только что прочитал причину, по которой локальные или анонимные внутренние классы могут обращаться только к конечным переменным. Причина в том, что JVM обрабатывает эти два класса как совершенно разные классы, и поэтому, если значение переменной в одном классе изменяется, оно не может быть отражено при запускевремя в другом файле класса.

Тогда мой вопрос заключается в том, как внутренний класс-член (нестатический) может иметь доступ к членам для членов класса верхнего уровня, поскольку JVM все еще рассматривает эти два класса как разныефайлы классов?Если значение переменной-члена класса верхнего уровня изменится, как это можно будет отразить в файле класса внутреннего класса во время выполнения?

Ответы [ 2 ]

5 голосов
/ 05 июня 2011

Это отдельные классы, но есть неявная ссылка на экземпляр "внешнего" класса во "внутреннем" классе.По сути, он действует как переменная, которую вы можете получить либо неявно, либо с помощью специального синтаксиса ContainingClassname.this.

. Обратите внимание: если вы не хотите такую ​​неявную ссылку, вы должны объявитьвложенный класс как static:

public class Outer
{
    private class Inner
    {
        // There's an implicit reference to an instance of Outer in here.
        // For example:
        // Outer outer = Outer.this;
    }

    private static class Nested
    {
        // There's no implicit reference to an instance of Outer here.
    }
}
1 голос
/ 05 июня 2011

this неявно является окончательным, вы не можете изменить его. Когда вы пишете что-то вроде

class Outer {
    int a;
    class Inner {
       { a = 1; }
    }
}

вы на самом деле пишете так же, как

class Outer {
    int a;
    class Inner {
       { Outer.this.a = 1; }
    }
}

a не является окончательным, но Outer.this есть, и это ссылка, которая используется.

...