2016-12-23 19 views
8

Czytałem o klasie wewnętrznej w Nauce Java. Znalazłem ten kodWewnętrzna klasa w Javie

class Animal{ 
    class Brain{ 
    } 
} 

Po kompilacji, javap 'Animal$Brain' daje wyjście jako

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

która wyjaśnia jak wewnętrzna klasa dostaje odniesienie do jego przykład załączając w wewnętrznej konstruktora klasy. Ale kiedy definiować wewnętrzną klasę jako prywatne jak ten

class Animal{ 
    private class Brain{ 
    } 
} 

następnie po kompilacji, javap 'Animal$Brain' daje wyjście jako

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

Więc dlaczego jest wyjście inaczej? Dlaczego wewnętrzny konstruktor klasy nie jest wyświetlany? W tym drugim przypadku również klasa wewnętrzna otrzymuje odwołanie do otaczającej instancji klasy.

+1

Domyślam się, że to dlatego, że publiczny konstruktor tej klasy już nie istnieje (nie możesz zrobić "nowego Animal(). New Brain();" teraz na zewnątrz). – Rogue

Odpowiedz

7

Dobre pytanie. Według this,

Jeśli stosowane są żadne opcje, druków javap zewnątrz opakowania, chronione i pól publicznych i metod klas przekazywanych do niej

Ponieważ zadeklarowały Brain jako prywatny klasy wewnętrznej, jego domyślny konstruktor zostanie domyślnie uczyniony prywatnym i dlatego nie będzie widoczny poza klasą Animal.

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

+0

Ponieważ javap drukuje domyślne, chronione i publiczne pola i metody klas przekazanych do niego i nie drukuje wewnętrznego konstruktora klasy, co oznacza, że ​​wewnętrzny konstruktor klasy jest prywatny. –

+1

Tak, zredagowałem odpowiedź – code

1

Domyślnie, grafiki javap non prywatne członkowie klas.

Możesz użyć opcji -p, aby wyświetlić wszystkie klasy i członków.

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

Compiled from "Animal.java" 
class Animal$Brain { 
    final Animal this$0; 
    private Animal$Brain(Animal); 
} 
Powiązane problemy