# Instanzmethoden mit statischen Methoden überschreiben



## deamon (11. Mrz 2009)

Hallo,

warum kann man Instanzmethoden nicht mit statischen Methoden überschreiben?

Beispiel:


```
public interface Schnittstelle
{
  void machwas();
}

public class Implementierung implements Schnittstelle
{
  public static void machwas()
  {
    irgendwasnützliches();
  }
}
```

Da bekommt man einen Compilerfehler, der einem sagt, dass man die Methode aus der Schnittstelle so nicht überschreiben kann, was auch so in einem Tutorial von Sun steht. Aber warum geht das nicht?


----------



## fjord (11. Mrz 2009)

Weil static Teil der Signatur der Methode ist und die überschreibende Methode die gleiche Signatur aufweisen muss wie die überschriebene.

edit by SlaterB: im weiteren Verlauf der Diskussion revidiert


----------



## Illuvatar (12. Mrz 2009)

Was willst du denn damit erreichen? Das macht ja auch von einem OOP-Standpunkt aus gar keinen Sinn.


----------



## Spacerat (12. Mrz 2009)

Huh... manchmal wäre es in Java schon hilfreich, wenn man so einer Klasse, welche das Interface implementiert, sagen könnte, das sie gefälligst eine statische Instanzierungs-Methode implementieren soll (z.B. "getInstance()"). Dan könnte man sich diese ständigen zusätzlichen Factory-Klassen sparen. In einem Interface sollte also folgendes möglich werden:
	
	
	
	





```
public interface ImplementMe
{
  static ImplementMe getInstance();
}
```
...was hör' ich da? Schwachfug? ...Ok, ihr habt ja recht... könnte problematisch werden, wenn man mehrere solcher Interfaces implementieren will (bzw. muss). Also doch wieder Factorys.


----------



## Ebenius (12. Mrz 2009)

fjord hat gesagt.:


> Weil static Teil der Signatur der Methode ist und die überschreibende Methode die gleiche Signatur aufweisen muss wie die überschriebene.


Die Signatur einer Methode besteht aus deren Namen plus der Liste der Typen aller Übergabeparameter. Kein einziger Modifier gehört dahin.

Ebenius


----------



## deamon (12. Mrz 2009)

Illuvatar hat gesagt.:


> Was willst du denn damit erreichen? Das macht ja auch von einem OOP-Standpunkt aus gar keinen Sinn.



Ich will erreichen, dass die Klassen, die eine statische Methode implementieren austauschbar sind und ich will nicht extra eine sinnlose Instanz erzeugen müssen, nur weil man in Schnittstellen keine statischen Methoden definieren kann. Im Moment behelfe ich mir damit, auf die Schnittstelle zu verzichten und die Implementierung hart zu verdrahten.

Im konkreten Fall handelt es sich um eine Methode, die eine Zeichenkette annimmt, verarbeitet und das Ergebnis zurück gibt. Die Verarbeitung kann man prima in einer statischen Methode machen, aber es könnte unterschiedliche Implementierungen geben.


----------



## tfa (12. Mrz 2009)

Dann vergiss den statischen Kram und definier dir ein Interface. Es geht halt nur mit Objekten, auch wenn sie sonst nutzlos zu sein scheinen. Warum sollte das stören? 
Irgendeine Implementierung hart zu verdrahten ist auf jeden Fall die schlechtere Lösung.


----------



## fjord (13. Mrz 2009)

@Ebenius: Du hast recht, da habe ich mich geirrt.
Würde ja meinen Beitrag editieren, damit die falsche Antwort nicht direkt als 1. steht, aber das scheint jetzt nicht mehr möglich zu sein.


----------



## deamon (16. Mrz 2009)

Ich glaube jetzt zu wissen, warum mein Vorhaben nicht gehen konnte. Der Aufruf von statischen Methoden wird bereits zur Übersetzungszeit festgelegt und da sich hinter einer Schnittstelle ja zur Laufzeit prinzipiell verschiedene Implementierungen verbergen können, kann der Compiler nicht festlegen, welche Implementierung aufgerufen wird.


----------

