# Wann / Wozu inner class



## y0dA (28. Apr 2008)

Aloha!

+) Wofür benutzt man eine inner classe, wann sinnvoll  (Beispiel)?


----------



## Niki (28. Apr 2008)

Das klassische Beispiel einer anonymen inneren Klasse ist bei Listenern:


```
public void guiInit(){
  
  JButton jbOK = new JButton("OK");
  jbOK.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
      control.ok();
    }
  });

}
```


----------



## y0dA (28. Apr 2008)

Und was sagt mir das Beispiel?
Sry checks grad nit, komme auch nicht aus der GUI-Ecke(AWT,Swing..)


----------



## Niki (28. Apr 2008)

Ich seh das ganze mit den inneren Klassen so: man kann sie verwenden, muss es aber nicht. Meistens werden sie verwendet weil man zu faul ist eine eigene Klasse zu erzeugen. In meinem Beispiel hätte ich zum Beispiel eine Klasse Controller mit einer Methode *ok*. Man kann natürlich auch eine Klasse schreiben, die einfach das Interface implementiert.
Ein anderes schönes Beispiel ist zum Beispiel eine nested Klasse bei Interfaces, die bereits eine Implementierung zurück liefern. (wird bei XMLBeans so gemacht). So etwas würde so aussehen:

```
public interface Person{
  public String getName();
  public void setName(String s);


  public static class Factory{
    public static Person getNewPerson(){
      return new PersonImpl();
    }
  }
}
```

Und hier die Implementierung dazu:

```
public class PersonImpl implements Person{
  private String name = null;

  public void setName(String name){
    this.name = name;
  }

  public String getName(){
    return this.name;
  }
}
```

Erzeugt wird das so:

```
Person p = Person.Factory.getNewPerson();
```

Bei Interfaces sind eingebettete Klassen immer statisch, daher spricht man von nested Klassen. Innere Klassen sind nicht statisch und brauchen einen Bezug zu einem Objekt, in dem sie eingebettet sind:

Beispiel einer inneren Klasse:


```
public class Outer{

  public class Inner{

  }


}
```

Inner könnte so erzeugt werden:


```
Inner i = new Outer().new Inner();

//oder

Outer o = new Outer();
Inner i = o.new Inner();
```


----------

