public static void main(String[] args) {
MyOuter outer_class = new MyOuter();
MyOuter.MyInner inner_class = outer_class.new MyInner();
}
Snippet 2:
Code:
public static void main(String[] args) {
MyOuter.MyInner inner_class = new MyOuter().new MyInner();
}
Wie kann ich das Erzeugen von inner Klassen verstehen? Ich lerne es jedesmal auswendig, aber nach ein paar Tagen vergesse ich es, da ich es nicht uebersetzen kann. Normalerweise benutzen wir new mit Klassennamen, aber hier ist es anders........
am besten, du vergisst das ganze schnell wieder (mal). Innere Klasse sollten normalerweise nur in der Klasse benuzt werden, wo sie definiert werden. Und dort macht man einfach "new InnerClass()".
Mag1c hat scho recht, Innere Klassen sollte man nicht von 'außen' verwenden. Trotzdem kann ich Dir kurz erklären wieso man sie so 'kompliziert' aufrufen muss.
Innere Klassen halten nämlich eine referenz auf eine Instanz ihrer äußeren Klasse. So ist es möglich methoden der äußeren Klasse direkt aufzurufen:
Code:
public class MyApp {
public class SaveButtonController() implements ClickMichListener {
public void clicked(ClickEvent event) {
save(); // methode von MyApp
}
}
public void createContent(Container container) {
// Nen Button hinzufügen
Button saveButton = new Button(container);
// <-- inline class ... im prinzip das selbe wie eine inner class.
saveButton.addClickMichListener(new SaveButtonController());
}
public void save() {
...
}
}
Wie du siehst kann der SaveButtonController ganz 'einfach' die save methode von MyApp aufrufen. Damit das funktioniert wird beim Compilieren aus der inner class 'SaveButtonController' eine Klasse die im Konstructor eine Instanz von MyApp bekommt:
Code:
public class SaveButtonController() implements ClickMichListener {
private MyApp _myApp;
public SaveButtonController(MyApp myApp) {
this._myApp = myApp;
}
public void clicked(ClickEvent event) {
_myApp.save();
}
}
ich hab das topic mittels suche mal ausgegraben...
Mag1c hat gesagt.:
am besten, du vergisst das ganze schnell wieder (mal). Innere Klasse sollten normalerweise nur in der Klasse benuzt werden, wo sie definiert werden. Und dort macht man einfach "new InnerClass()".
wenn ich eine Klasse habe, die nur sehr klein ist und immer nur von einer bestimmten klasse generiert werden muss, somit allein auch keinen sinn macht, aber in einer zweiten klasse trotzdem gebraucht wird. macht es dann sinn - eventuell einfach nur aus gründen der übersichtlichkeit - diese klasse zu einer inneren klasse zu machen? oder auch dann nicht?
und wie siehts mit enum's aus? (ich hab diese aus übersichtlichkeit oft zu ner klasse gepackt in deren verbindung die enum gebraucht wird. das heißt aber nicht, dass ich die enum nicht auch außen brauchen (zb um eine Methode der Klasse, in der die enum implementiert ist, aufzurufen).
... macht es dann sinn - eventuell einfach nur aus gründen der übersichtlichkeit - diese klasse zu einer inneren klasse zu machen? oder auch dann nicht?
Ich denke das ist Geschmackssache. Speziell eine innere statische Klasse verhält sich genauso wie eine normale Klasse. Hier braucht man also keine Instanz der umgebenden Klasse, dafür kann eine innere statische Klasse aber auch nicht auf die nicht statischen Felder der äusseren zugreifen.
-frank hat gesagt.:
und wie siehts mit enum's aus? (ich hab diese aus übersichtlichkeit oft zu ner klasse gepackt in deren verbindung die enum gebraucht wird. das heißt aber nicht, dass ich die enum nicht auch außen brauchen (zb um eine Methode der Klasse, in der die enum implementiert ist, aufzurufen).
Wiederrum Geschmackssache und equivalent zu einer normalen inneren Klasse. Nur das man Enums so gut wie immer static machen kann und es sich somit fast anbietet diese mit in die Klasse zu packen.