2015-04-13 10 views
5

Rozumiem pojęcie klasy najwyższego poziomu, który rozciąga się wewnętrzną klasę:Top klasa poziom powiększenia wewnętrzną klasę

package pkg1; 
public class A { 
    public class B { 
    } 
} 

package pkg2; 
import pk1.A; 
public class C extends A.B { 
    public C() { 
     new A().super(); 
    } 
} 

Ale nie mogę wymyślić żadnego rzeczywistego przykład, który ilustruje to. To właśnie dlatego powinniśmy skorzystać z takiej implementacji?

+0

Dlaczego warto używać klas zagnieżdżonych? [Dokumenty] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) –

+0

Jesteś pewien, że to jest dla Javy? Ponieważ ten kod nie zostanie skompilowany. Java nie może również rozciągać się z wielu klas. – Leon

+4

Dla wszystkich, którzy twierdzą, że nie będzie kompilować: tak, klasa zagnieżdżona musi być statyczna. A dla innych, którzy twierdzą, że dziedziczenie wielu klas nie jest możliwe, tak nie jest. I nikt nie mówi, że tak. – Zizouz212

Odpowiedz

3

Dlatego powinniśmy skorzystać z takiej implementacji?

Nie powinieneś. Jeśli C musi utworzyć własną instancję zamykającą, to nie jest już semantycznie "wewnętrzna".

Funkcja ta jest bardziej przydatna, gdy przechodzą na otaczającą Instancji, który zachowuje się tak samo jak wewnętrzny Klasa:

class C extends A.B { 
    C(A enclosing) { 
     enclosing.super(); // note: invokes a constructor 
    }      //  of the B superclass 
} 

(z wyjątkiem nie możemy użyć wyrażenia tworzenia instancji klasy jak someA.new C() my. musisz użyć new C(someA).)

Ale jeśli będziesz musiał tego użyć, prawdopodobnie oznacza to, że zaprogramowałeś się w kącie. B powinna być prawdopodobnie klasą najwyższego poziomu lub static z jawnie przekazaną "instancją załączającą".

+0

@ Claudio 'enclosing.super()' nie wywołuje konstruktora 'enclosing', wywołuje konstruktor superklasy' B'. Tyle zamieszania na to pytanie ... – Radiodef

+0

Masz rację. Mój błąd – Claudio

Powiązane problemy