Может ли внешний класс получить доступ к членам внутреннего класса? - PullRequest
8 голосов
/ 24 апреля 2011

Внутренний класс - это класс, определенный внутри класса, и внутренний класс может быть объявлен как открытый, закрытый, защищенный.Если внутренний класс определен как закрытый и защищенный, может ли внешний класс получить доступ к членам внутреннего класса?и могут ли внутренние классы обращаться к членам внешнего класса?

Ответы [ 5 ]

24 голосов
/ 24 апреля 2011

В общем, вы можете (получить доступ к закрытым полям внутренних классов и наоборот).Следующий код компилируется в Eclipse:

public class Outer {

  private int x;

  public void f() {
    Inner inner = new Inner();
    inner.g();
    inner.y = 5;
  }

  private class Inner {
    private int y;

    public void g() { x = 5; }
  }    
}

При этом вы можете настроить свой IDE / компилятор так, чтобы доступ к таким полям рассматривался как ошибки (в Eclipse этот параметр называется «Доступ к недоступному элементутип включения ", в Предпочтения -> Java -> Компилятор -> Ошибка / Предупреждения -> Стиль кода)

18 голосов
/ 24 апреля 2011

Если внутренний класс определен как закрытый и защищены, может доступ к внешнему классу члены внутреннего класса?

Да. Эти квалификаторы влияют только на видимость внутреннего класса в классах, производных от внешнего класса.

Может ли внутренний класс иметь доступ к членам внешний класс?

Да, включая те, которые объявлены private, как любой метод экземпляра.

2 голосов
/ 21 марта 2014

Да!Вы можете получить доступ как к внутреннему члену класса из внешнего класса, так и наоборот (независимо от модификатора доступа).Однако для статического вложенного класса вы не можете получить доступ к его полю только по имени поля, и вам нужно получить к нему доступ как

InnerClass.staticInnerField 

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

1 голос
/ 18 ноября 2017

Объяснение в контексте обычного внутреннего класса [Обычные внутренние классы не могут иметь статические члены, объявленные внутри них]

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

class Outer {
  private static int x = 0;

  class Inner {
    void print() {
      System.out.println(x); // x can be directly accessed
    } 
  }

  public static void main(String[] args) {
    new Outer().new Inner().print();
  }
}

Четный Outer класс может получить доступ к любому полю внутреннего класса, но через объект внутреннего класса.

class Outer {
  private class Inner {
    private int x = 10;
  }

  void print() {
    Inner inner = new Inner();
    System.out.println(inner.x);
  }

  public static void main(String[] args) {
    Outer outer = new Outer();
    outer.print();
  }
}
1 голос
/ 24 апреля 2011

"Вложенный класс - это класс, определенный в другом классе. Вложенный класс должен существовать только для того, чтобы служить его вмещающий класс. Если вложенный класс было бы полезно в каком-то другом контексте, тогда это должен быть класс верхнего уровня. Есть четыре вида вложенных классы: статические классы-члены, классы нестатических членов, анонимные классы и местные классы. Все кроме первый вид известен как внутренний классы ".

(Джошуа Блох, из книги Эффективная Ява.)

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

То есть очень много, как можно было бы ожидать =).

...