2016-12-23 2 views
8

Я читал о классе Inner в Learning Java. Я нашел этот кодВнутренний класс в 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; 
} 

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

+1

Я думаю, это потому, что открытый конструктор класса исчез (вы не можете сделать 'нового животного() новый мозг();.' Теперь внешне). – Rogue

ответ

7

Хороший вопрос. По this,

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

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

Ref: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9

+0

Поскольку javap печатает стандартные, защищенные и общедоступные поля и методы классов, переданных ему, и он не печатает внутренний конструктор классов, поэтому подразумевается, что внутренний конструктор классов является закрытым. –

+1

Да, я отредактировал ответ – code

1

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

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

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

Compiled from "Animal.java" 
class Animal$Brain { 
    final Animal this$0; 
    private Animal$Brain(Animal); 
} 
Смежные вопросы