2012-06-14 9 views
6

Was bedeutet es, eine nicht statische innere Klasse als final zu deklarieren?Was sind die letzten inneren Klassen?

Ich habe versucht, viele Links auf Google und stackoverflow.com auch gut, aber alle von ihnen scheinen sich über innere Klassen Umgang mit den letzten Mitgliedern nicht endgültige innere Klassen selbst zu tun. Ich fand this Link auf Google, aber selbst es erklärt es nicht.

Vielen Dank im Voraus!

+0

Sehen Sie hier http://en.wikipedia.org/wiki/Final_%28Java%29#Final_classes – user845279

+2

Warum würden Sie erwarten, dass es etwas anderes bedeutet, als ein Klassenfinale der obersten Ebene zu machen? –

+0

gut, weil die innere Klasse eine Klasse ist, aber es ist auch ein Mitglied der äußeren Klasse. also wäre es nicht vererbbar oder es wird ein anderes Verhalten wegen des Finales geben? –

Antwort

0

Es hat dieselbe Semantik wie eine äußere Klasse, die als final deklariert wird: Die Klasse kann nicht erweitert werden.

dieses Beispiel vor:

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

Wenn Sie das letzte Modifikator A hinzufügen, wird es einen Übersetzungsfehler erzeugen.

+0

thnx! Wie würde ich auch eine nicht-finale innere Klasse von außerhalb der äußeren Klasse erweitern? 'TestClass erweitert MyOuter.MyInner' ?? –

+0

TestClass benötigt einen Konstruktor, der einen MyOuter verwendet. Dann rufst du MyOuters Super-Methode an. –

+0

@SurenderThakran Ich denke, das ist nur möglich, wenn die innere Klasse, die du erweitern willst, statisch ist. Siehe diese [Vererbungsmatrix] (http://mindprod.com/jgloss/nestedclasses.html#INHERITANCE) – user845279

5

Es gibt keinen semantischen Unterschied zwischen der Erstellung einer Top-Level-Klasse final und der Erstellung einer inneren Klasse final: Es teilt dem Compiler mit, dass Sie nicht von der Klasse erben können. Die Markierungsklassen final werden manchmal ausgeführt, damit der Compiler eine virtuelle Tabellennachfrage überspringen kann, aber dies wird oft als vorzeitige Mikrooptimierung angesehen.

0

Nun, innere Klassen unterscheiden sich in diesem Kontext nicht von äußeren Klassen. Also der folgende Code ist absolut gültig.

class Outer { 
int some_member; 

class Inner { 
void method(); 
} 
} 

class OuterExtendsInner extends Outer.Inner{ 

} 

Wie wir alle wissen, ist der Zweck, eine Klasse endgültig zu erklären, dass wir alle außerhalb Eindringling von Subklassen der Klasse und zu nutzen, seine Einrichtungen, die gleiche Art und Weise verhindern wir bei inneren Klassen tun.

Verwandte Themen