# static mit abstract und in interface



## stev.glasow (9. Jan 2004)

wieso kann man static nicht in kombination mit abstract und nicht in interfaces benutzen.


----------



## HeyMan (9. Jan 2004)

hatte glaub ich was mit der verhinderung von dead locks zu tun.
bin mir aber nicht mehr ganz sicher.
heyman


----------



## René Link (10. Jan 2004)

Hi,

als erstes musst du dir über zwei Ebenen ganz klar werden. Die eine Ebene ist die Klassen Ebene
die andere die Objekt-Ebene.

Mit abstract erzwingst du, dass eine Subklasse diese Methode überschreiben muss.
Static bedeutet, dass es eine Eigenschaft oder Methode einer Klasse ist.

Was würde jetzt also passieren, wenn du static mit abstract verbindest?
Du würdest verlangen, dass eine statische Methode in einer Subklasse überschrieben werden soll.
Da du auf statische Methoden über die Klasse zugreifst und nicht über das Objekt macht
das keinen Sinn. Oder anderes ausgedrückt. Überschreiben basiert auf dem Typ des Objekts und
statische Methoden sind einer Klasse zugeordnet.

Warum abstract und static nicht zusammen geht müsste jetzt klar sein.
Nun zu den Interfaces.
Interfaces sind ja nur Schnittstelleninformationen. Oder anders ausgedrückt Methoden deklarationen.
Jede Klasse, welche ein Interface implementiert, muss also diese Methoden implementieren.
Die Methoden eines Interfaces sind implizit 'public abstract'. Dadurch wird erzwungen, dass die Methoden
implementiert werden müssen. Wie eben gezeigt, können sie nicht gleichzeitig static sein. Was ist
aber mit den anderen Zugriffsmodifizierern. Warum public?
Was wäre, wenn sie private wären? Dann würde das keinen Sinn machen. Warum?
Weil dann die Schnittstelle nur der Klasse bekannt wäre, welche dieses Interface implementiert.
Das ist Unsinn, weil eine Klasse ihre eigene Schnittstelle immer kennt. Mit Interfaces will man ja
gerade erreichen, dass man einer anderen Klasse zusichert, dass man die Schnittstelle implementiert.
Anders ausgedrückt - dass man über eine bestimmte Funktionalität verfügt.

In Interfaces können aber auch Variablen definiert werden. Diese sind implizit 'public static final'.
Macht auch Sinn, weil die Werte der Variablen zu der Schnittstelle gehören, sollen sie nicht veränderbar sein.
Variablen welche nur gelesen werden können braucht man nicht mit jedem Objekt neu anzulegen. Deshalb static. :lol: 

Ich hoffe das hilft etwas weiter.
Schau dich auch mal hier um:
http://www.computer-link.de/view.php?chapterID=30
http://www.computer-link.de/view.php?docID=3


----------



## Pulvertoastman (12. Jan 2004)

Oder auch hier:
http://www.java-forum.net/viewtopic.php?t=1531


----------



## mephi (15. Jun 2007)

was die suche alles ausspuckt.. 
so hab mich eben dafür interessiert wie man ein singleton ansatz im interface festhalten soll..



			
				René Link hat gesagt.:
			
		

> Was würde jetzt also passieren, wenn du static mit abstract verbindest?
> Du würdest verlangen, dass eine statische Methode in einer Subklasse überschrieben werden soll.
> Da du auf statische Methoden über die Klasse zugreifst und nicht über das Objekt macht
> das keinen Sinn. Oder anderes ausgedrückt. Überschreiben basiert auf dem Typ des Objekts und
> statische Methoden sind einer Klasse zugeordnet.



der typ eines objekts ist ja die klasse.. !?
warum soll ich eine subklasse eine statische methode nicht überschreiben? versteh ich nicht wirklich..


----------



## Murray (15. Jun 2007)

mephi hat gesagt.:
			
		

> Warum soll ich eine subklasse eine statische methode nicht überschreiben? versteh ich nicht wirklich..



Das musst du Gosling & Co fragen; ansonsten ist das eine Tatsache, die man einfach hinnehmen muss: statische Member kann man nicht überschreiben.

/EDIT: Typos


----------



## Wildcard (15. Jun 2007)

Das ist keine Tatsache die man hinnehmen muss, alles andere wäre schlicht und ergreifend völliger Unsinn.
Das Überschreiben von Methoden macht im Bereich der Verebung Sinn, statische Methoden sind jedoch nicht an Objekte gekoppelt und fallen daher komplett aus der Verebung raus.


----------



## Murray (15. Jun 2007)

Wildcard hat gesagt.:
			
		

> Das ist keine Tatsache die man hinnehmen muss, alles andere wäre schlicht und ergreifend völliger Unsinn.


Das ist - zumindest ein Stück weit - Ansichtssache: angemommen, ich habe Class A mit mit 

```
public static A getInstance()  {
  return new a())
}
```
und davon abgeleitet  

```
Class B extends A {
public static B getInstance()  {
  return new b())
}
}
```

Wenn ich jetzt per Reflection ein Objek objB vom Typ B am Wickel habe, dann liefert mir  ovbjB.class.getMethods beide getInstance-Methoden -  da könnte man der Meinung sein, dass immer die der MDC geliefert werden sollte.  

Wenn man  dieses Verhalten aber einmal verinnerlicht hat, dann kommt man auch mit dieser Philosophie zurecht.


----------



## Hilefoks (15. Jun 2007)

```
public Class A {
  public static A getInstance()  {
    return new a())
  }
}
```
und davon abgeleitet  

```
Class B extends A {
  public static B getInstance()  {
    return new b())
  }
}
```
Die static Methode ist nicht an die Instanz gebunden. Sie existiert nur einmal. Wenn die Klasse B diese überschreiben könnte, dann wär diese Methode auch für A überschrieben - daher ist es nicht möglich sie zu überschreiben.

MfG,
Hilefoks


----------



## mephi (16. Jun 2007)

das sind jetzt sehr gute beispiele *g* aber mir ist halt vollkommen nicht klar warum die vererbung an die instanz gebunden sein muss(soll) und nicht an die klasse
vielleicht steh ich nur ich nur auf dem schlauch oder vielleicht ist mir der tiefere sinn nicht klar. aber .... ich verstehs nicht *g*

wenn ich eine statische methode einer klasse hab, dann mag diese erstmal nichts mit der instanz zutun haben die von dieser klasse erbt. aber die erbende klasse wiederum hat ja was damit zutun.
gerade am beispiel des singleton macht eine mögliche vererbung für mich mehr sinn als dass diese nicht möglich ist...


----------



## Beni (16. Jun 2007)

Der Witz an der Vererbung ist doch, dass du im Code etwas haben kannst wie...

```
object.doSomething()
```
... und jenachdem, was "object" für einen Wert hat, werden verschiedene "doSomething"-Methoden aufgerufen.

Bei einer static-Methode hast du aber...

```
Klasse.doSomething()
```
... und "Klasse" ist immer dasselbe. Also nützt dir hier Vererbung einfach nichts.

Ich gebe zu, dass in ganz seltenen Fällen eine static-Vererbung nützlich sein könnte. Aber das ist so selten, dass ich sie nicht vermisse.


----------

