2012-06-14 28 views
6

Cosa significa dichiarare una classe interna non statica come final?Quali sono le classi interne finali?

Ho provato molti collegamenti su google e stackoverflow.com ma tutti sembrano occuparsi di classi interne che accedono ai membri finali non di classi interne finali. Ho trovato il link this su google, ma anche questo non lo spiega.

Grazie in anticipo!

+0

Vedi qui http://en.wikipedia.org/wiki/Final_%28Java%29#Final_classes – user845279

+2

Perché dovresti aspettarti che significhi qualcosa di diverso dal fare una finale di classe di alto livello? –

+0

bene perché la classe interna è una classe ma è anche un membro della classe esterna. quindi sarebbe non ereditabile o ci saranno altri comportamenti a causa del finale? –

risposta

0

Ha la stessa semantica di una classe esterna dichiarata definitiva: la classe non può essere estesa.

Considerate questo esempio:

public class MyClass { 
    public class A { 
    } 
    public class B extends A { 
    } 
} 

Se si aggiunge il modificatore finale alla A verrà generato un errore di compilazione.

+0

thnx! inoltre, come potrei estendere una classe interiore non finale al di fuori della classe esterna? 'TestClass estende MyOuter.MyInner' ?? –

+0

TestClass richiede un costruttore che accetta un MyOuter. Quindi chiami il super metodo di MyOuter. –

+0

@SurenderThakran Penso che sia possibile solo se la classe interna che stai cercando di estendere è statica. Vedi questa [matrice ereditaria] (http://mindprod.com/jgloss/nestedclasses.html#INHERITANCE) – user845279

5

Non c'è alcuna differenza semantica tra la creazione di una classe di livello superiore final e la creazione di una classe interna final: indica al compilatore che non è possibile ereditare dalla classe. Le classi di marcatura final vengono talvolta eseguite per consentire al compilatore di saltare una ricerca di tabella virtuale, ma questo viene spesso considerato come una prematura ottimizzazione del micro.

0

Bene, le classi interne non sono affatto diverse dalle classi esterne in quel contesto. Quindi il seguente codice è perfettamente valido.

class Outer { 
int some_member; 

class Inner { 
void method(); 
} 
} 

class OuterExtendsInner extends Outer.Inner{ 

} 

Come tutti sappiamo, lo scopo di dichiarare una classe finale è che possiamo prevenire qualsiasi intruso fuori dal sottoclassi della classe e sfruttare le sue strutture, allo stesso modo siamo in grado di fare in caso di classi interne.

Problemi correlati