Внутренний класс в Java

Я читал о внутреннем классе в Learning Java. я нашел этот код

class Animal{
   class Brain{
   }
}

После компиляции javap 'Animal$Brain' выводит как

Compiled from "Animal.java"class 
Animal$Brain {
    final Animal this$0;
    Animal$Brain(Animal);
}

что объясняет, как внутренний класс получает ссылку на включающий его экземпляр в конструкторе внутреннего класса. Но когда я определяю внутренний класс как частный, как это

class Animal{
   private class Brain{
   }
}

затем после компиляции javap 'Animal$Brain' выдает результат как

Compiled from "Animal.java"
class Animal$Brain {
    final Animal this$0;
}

Так почему выход другой? Почему конструктор внутреннего класса не показан? В последнем случае также внутренний класс получает ссылку на экземпляр окружающего класса.


person Ashish Pani    schedule 23.12.2016    source источник
comment
Я предполагаю, что это потому, что общедоступный конструктор класса ушел (теперь вы не можете делать new Animal().new Brain(); извне).   -  person Rogue    schedule 23.12.2016


Ответы (2)


Хороший вопрос. Согласно этому,

Если никакие параметры не используются, javap выводит пакеты, защищенные и общедоступные поля и методы переданных ему классов

Поскольку вы объявили Brain закрытым внутренним классом, его конструктор по умолчанию будет неявно сделан закрытым и, следовательно, не будет виден за пределами класса Animal.

Ссылка: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9

person code    schedule 23.12.2016
comment
Поскольку javap печатает стандартные, защищенные и общедоступные поля и методы классов, переданных ему, и не печатает конструктор внутреннего класса, это подразумевает, что конструктор внутреннего класса является закрытым. - person Ashish Pani; 23.12.2016

По умолчанию javap печатает не частные члены классов.

Вы можете использовать опцию -p, чтобы показать все классы и члены.

//javap -p 'Animal$Brain.class'

Compiled from "Animal.java"
class Animal$Brain {
  final Animal this$0;
  private Animal$Brain(Animal);
}
person isprout    schedule 18.07.2017