# Unterschied zwischen nicht-statischen und statischen Klassen



## jago (8. Mai 2008)

Hi,

Ich benutze oft nested Klassen in meinem Code - Erweiterungen von:

DefaultListCellRenderer
ItemListener
AbstractAction

usw.

Ich frage mich wo der Unterschied liegt ob ich diese als


```
private final class
private final static class
```

definiere? Was macht das static? Was passiert wenn ich das static weglasse. Wann benutzt man was und warum?

Danke,
jago


----------



## foobar (8. Mai 2008)

Das static bewirkt hier, daß die innere Klasse nur in der Toplevel Klasse deklariert ist, aber ansonsten keine Beziehung zu der äußeren Klasse hat.
Wenn du eine nicht statische innere Klasse instanziieren willst, brauchst du immer eine Instanz der äußeren Klasse. Bei der statischen inneren Klasse ist das nicht der Fall. 
Probier das einfach mal aus. Instanziiere mal aus einer anderen Toplevel Klasse eine statische innere Klasse einer anderen Toplevel Klasse, dann siehste den Unterschied.


----------



## Gast (8. Mai 2008)

http://www.java-forum.org/de/viewtopic.php?t=7256


----------



## Guest (8. Mai 2008)

foobar hat gesagt.:
			
		

> Das static bewirkt hier, daß die innere Klasse nur in der Toplevel Klasse deklariert ist, aber ansonsten keine Beziehung zu der äußeren Klasse hat.
> Wenn du eine nicht statische innere Klasse instanziieren willst, brauchst du immer eine Instanz der äußeren Klasse. Bei der statischen inneren Klasse ist das nicht der Fall.
> Probier das einfach mal aus. Instanziiere mal aus einer anderen Toplevel Klasse eine statische innere Klasse einer anderen Toplevel Klasse, dann siehste den Unterschied.



kann ich mir denken. Ob statisch oder nicht soll es sich um Hilfsklassen handeln, die ausserhalb nicht sichtbar sein sollen. D.h. die Frage diese Klassen von Ausserhalb zu instanzieren stellt sich erst gar nicht.

Wenn ich diese Hilfsklassen als statisch definiere, muessen alle Attribute der Toplevel Klasse auf die es zugreift ebenfalls statisch sein. Das Gegenteil ist auch der Fall - wenn meine Toplevel vor allen nicht statische Attribute verwendet, dann muessen alle nested Klassen die darauf zugreifen nicht-statisch sein.

Ich frage mich welche Entscheidung die cleverere ist und ob man einen der beiden Wege spaeter bereut?

Danke,
jago


----------



## foobar (9. Mai 2008)

Statische Member sollte man nur in ausnahme Fällen verwenden. Wenn die innere Klasse nur in der Toplevel Klasse verwendet wird, solltest du die innere als nicht statisch deklarieren ausser du willst die beiden Klassen vorsorglich entkoppeln.


----------



## tfa (9. Mai 2008)

foobar hat gesagt.:
			
		

> Statische Member sollte man nur in ausnahme Fällen verwenden. Wenn die innere Klasse nur in der Toplevel Klasse verwendet wird, solltest du die innere als nicht statisch deklarieren ausser du willst die beiden Klassen vorsorglich entkoppeln.



Eine Nested Class sollte immer als static deklariert werden, wenn dies möglich ist (also die Exemplare keine Referenz auf die äußere Klasse benötigen). Man sollte vorsorglich natürlich immer seine Klassen entkoppeln, außerdem gibt es einen (wenn auch kleinen) Performance-Vorteil.
Wenn die innere Klasse nur in der dazugehörigen Top-Level-Klasse gesehen werden soll, musst du sie eben auch noch private machen.
Eine statische Member-Klasse ist übrigens keine _Inner Class_, sondern nur eine _Nested Class_.


----------

