2015-07-29 27 views
11

Ho iniziato a prepararmi per l'esame OCJP7 e ho trovato questo capitolo che sembra essere molto complicato.Classi Java interne e nidificate

Diciamo che ho questo codice:

class Outer1{ 
    interface InnerInterface{ 
     String x = "test"; 
    } 
    class InnerClass{ 
     String x = "test"; 
    } 
} 
class Outer2{ 
    static interface NestedInterface{ 
     String x = "test"; 
    } 
    static class NestedClass{ 
     String x = "test"; 
    } 
} 
class Main{ 
    public static void main(String [] args){ 
     String s1 = Outer1.InnerInterface.x; 
     String s2 = new Outer1().new InnerClass().x; 
     String s3 = Outer2.NestedInterface.x; 
     String s4 = new Outer2.NestedClass().x; 
    } 
} 

Mi può dire perché possiamo accedere Outer1.InnerInterface.x e Outer2.NestedInterface.x nello stesso modo? Le interfacce interne sono statiche di default? Sto cercando di creare delle connessioni per renderle più chiare.

+0

possibile duplicato di [Perché un'interfaccia statica interna deve essere utilizzata in Java?] (Http://stackoverflow.com/questions/71625/why-would-a-static-inner-interface-be-used-in- java) –

risposta

11

Da Oracle's Java Tutorial:

Una classe annidata è un membro della sua classe di inclusione. Le classi nidificate non statiche (classi interne) hanno accesso ad altri membri della classe allegata, anche se sono dichiarate private. Le classi nidificate statiche non hanno accesso ad altri membri della classe che li include. Come membro di OuterClass, una classe nidificata può essere dichiarata privata, pubblica, protetta da o privata. (Ricordiamo che le classi esterni possono essere dichiarati solo pubblico o un pacchetto privato.)

interfacce non possono essere istanziati. Quindi hanno senso solo come statici. Dichiarare un'interfaccia annidata come statica è ridondante.

Inoltre, l'esercizio utilizza nomi confusi per le interfacce.
Entrambi InnerClass e NestedClass sono classi nidificate. Ma solo InnerClass è una classe interna poiché "classe interna" significa "classe nidificata non statica".
Analogamente ci si potrebbe aspettare che InnerInterface sia una "interfaccia interna" che significa "interfaccia nidificata non statica"; ma una cosa del genere non esiste. Sia InnerInterface e NestedInterface sono interfacce nidificate e nessuna di esse è un'interfaccia interna.

+0

Non sei sicuro del motivo per cui citi questa parte dal tutorial Java, in quanto parla di classi e la domanda riguarda le interfacce. La denominazione di questo esercizio non è solo confusa, ma semplicemente errata, perché non esiste un'interfaccia interna. L'unico tipo di interfaccia nidificata esistente è l'interfaccia membro. https://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html –

+0

Il punto della domanda è "classi interne e nidificate di Java". E il codice menziona entrambe le interfacce e le classi. Considero la domanda come una questione sia di cloche nidificate/interiori che di interfacce nidificate/interiori. E su quale differenza ci sono tra loro. La differenza (oltre a quelle tra le classi e le interfacce in generale) è che le classi interne esistono e le interfacce interne non lo fanno, come dici tu nel tuo consiglio e io nella mia risposta. –

7

Sì, le interfacce nidificate sono implicitamente static. Section 8.5.1 of the JLS dichiara:

Un'interfaccia membro è implicitamente static (§ 9.1.1). È consentito per la dichiarazione di un'interfaccia membro specificare in modo ridondante il modificatore static.

A causa di questo, è possibile accedere x attraverso l'interfaccia nidificato nello stesso modo attraverso corsi esterni Outer1 e Outer2 - entrambe le interfacce nidificati, InnerInterface e NestedInterface sono static.

3

Mi può dire perché possiamo accedere Outer1.InnerInterface.x e Outer2.NestedInterface.x nello stesso modo?

Perché sono entrambi i campi static.

da Java Language Specification, capitolo 9. Interfacce, punto 9.3 campo (costante) dichiarazioni:

Ogni dichiarazione di campo nel corpo di un'interfaccia è implicitamente public, static e final.


interfacce interne sono statici di default?

Sì.

Da 8.1.3 Inner Classes and Enclosing Instances:

interfacce Stati (§8.5) sono implicitamente static in modo che siano mai considerato classi interne.

+0

Sì, so che i campi di un'interfaccia sono statici, ma non sapevo che un'interfaccia dichiarata all'interno di una classe sia statica. Ho finito il capitolo e non ho trovato una risposta ... Grazie – Mike

1

Hai ragione. La parola chiave static per le interfacce nidificate non è necessaria e ridondante. Un'interfaccia nidificata è sempre statica.

Da un punto di vista logico, non ha senso che una definizione di interfaccia sia associata a un'istanza specifica della classe esterna.

Problemi correlati