2015-04-13 21 views
5

capisco il concetto di una classe di primo livello che si estende una classe interna:classe di primo livello che si estende una classe interna

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

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

Ma io non riesco a capire una vera esempio che illustra questo. Cioè, perché dovremmo usare tale implementazione?

+0

Perché utilizzare classi nidificate? [Docs] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) –

+0

Sei sicuro che sia per Java? Perché questo codice non verrà compilato. Anche Java non può estendersi da più classi – Leon

+4

Per tutti quelli che dicono che non verrà compilato: lo fa, la classe nidificata deve essere statica. E per altri che dicono che l'ereditarietà multipla delle classi non è possibile, non lo è. E nessuno dice che lo sia. – Zizouz212

risposta

3

Cioè, perché dovremmo utilizzare tale implementazione?

Non si dovrebbe. Se C deve creare la propria istanza di inclusione, allora non è più semanticamente "interiore".

Questa funzione è più utile quando si passa l'istanza che racchiude in, che si comporta come una classe interna:

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

(Tranne non possiamo usare un'espressione di creazione istanza di classe come someA.new C() Noi. devi usare new C(someA).)

Ma se ti ritrovi a doverlo usare, probabilmente significa che ti sei programmato in un angolo. B dovrebbe probabilmente essere una classe di livello superiore o static con "istanza allegata" inoltrata esplicitamente.

+0

@Claudio 'enclosing.super()' non richiama un costruttore di 'enclosing', invoca un costruttore della superclasse' B'. Tanta confusione su questa domanda ... – Radiodef

+0

Hai ragione. Colpa mia – Claudio

Problemi correlati