# Unterschied zwischen statische und nicht statische Methoden?



## Jack159 (1. Feb 2012)

Hallo,

Ich hab mir bereits mehrere Erklärungen zu dem Thema angeschaut, verstehe es abber immer noch nicht so wirklich.

Gerade in Eclipse hab ich 2 mal die identische Methode erstellt, jedoch einmal mit static und einmal ohne.
Mir wird kein Fehler angezeigt, was mich nur noch mehr verwirrt. Es scheint also völlig egal ob static oder nicht?! ???:L


```
public class Test {
	
	
	public void hoch(int x) {
		x++;
	}
	
	public static void hoch2(int x) {
		x++;
	}
	
	public static void main(String[] args) {
		
		
		
	}

}
```


----------



## HimBromBeere (1. Feb 2012)

Static heißt soviel wie, du brauchst keine Instanz der Klasse erstellen, um die Funktion nutzen zu können, in deinem Fall geht also 

```
Test.hoch2(3);
```
aber auch 

```
t = new Test();
t.hoch(3);
```
wobei du für letzteres eine Instanz brauchst (hier t).


----------



## Jack159 (1. Feb 2012)

HimBromBeere hat gesagt.:


> Static heißt soviel wie, du brauchst keine Instanz der Klasse erstellen, um die Funktion nutzen zu können



Das braucht man doch generell nicht?! ???:L
Kannst du (oder jemand anderes) bitte ein Beispiel nennen, wo ich ein Objekt brauche, um eine bestimmte Methode aufrufen zu können? Vielleicht verstehe ich es dann.


----------



## qowaz (1. Feb 2012)

```
public class Test {
    
    
    public void hoch(int x) {
        x++;
    }
    
    public static void hoch2(int x) {
        x++;
    }
    
    public static void main(String[] args) {
        int i = 1;

        hoch(i); // geht nicht, da Methode nicht statisch und noch keine Referenz des Objekts erzeugt wurde

        hoch2(i); // geht, da Methode statisch
 
    }
 
}
```


----------



## HimBromBeere (1. Feb 2012)

Stell dir vor, du hast eine Klasse Mensch geschrieben. Diese Klasse kennt die Methode 
	
	
	
	





```
laufen()
```
. Nun wäre es ja quatsch, wenn diese Methode statisch wäre, da die Methide ja dafür gedacht ist, einen ganz bestimmten Menschen (Und nicht die Menschheit im allgemeinen) zu bewegen. 
Nun erstellst du mit Mensch m = new Mensch() einen neuen Mensch. 
Anscließend rufst du 
	
	
	
	





```
m.laufen()
```
 auf, um diesen EINEN Menschen "zum Laufen zu bewegen"


----------



## Jack159 (1. Feb 2012)

HimBromBeere hat gesagt.:


> Stell dir vor, du hast eine Klasse Mensch geschrieben. Diese Klasse kennt die Methode
> 
> 
> 
> ...




Und wenn wir nur einen einzigen Menschen in unserem Programm haben?


----------



## HimBromBeere (1. Feb 2012)

Weil die Methode main ja auch statisch ist, also zur Klasse test gehört und nicht zu einer speziellen Instanz von Test. Jetzt stell dir mal vor, deine Klasse test hätte eine Instanzvariable int k, die du in der main irgendwie verwenden möchtest. Woher soll denn nun aber der Compiler wissen, von welcher Instanz er das k nehmen soll (bei 7mrd. Menschen auf der Welt...). Daher kannst du in einem statischen Kontext nur statische Variablen und Methoden nutzen...

EDIT:


> Und wenn wir nur einen einzigen Menschen in unserem Programm haben?


Kommt drauf an, ob du auf Instanzvariabken zugreifen musst (z.B. die Geschwindigkeit dieses Menschen) oder ob du die statisch definiert hast... generell würde es gehen


----------



## pro2 (1. Feb 2012)

Jack159 hat gesagt.:


> Und wenn wir nur einen einzigen Menschen in unserem Programm haben?



Generell arbeitet man eher wenig mit statischen Methoden. Die objektorientierte Programmierung (hey, fällt was auf?) arbeitet nämlich hauptsächlich mit Objekten. Statische Methoden sind meistens Methoden zur Berechnung gewisser Dinge oder z. B. zur Umrechnung. So sind Math.random(); oder Integer.parseInt(); statische Methoden, da es ja unsinnig wäre, sich immer dafür Obejtek zu erstellen.


----------



## Jack159 (1. Feb 2012)

Also kann man vereinfacht sagen: 
Wenn man eine Methode aufruft, die nicht im Bezug eines Objektes steht bzw. nichts mit Objekten/Objektvariablen am Hut hat, dann muss die Methode static sein?!


----------



## asimov1981 (1. Feb 2012)

Jack159 hat gesagt.:


> Also kann man vereinfacht sagen:
> Wenn man eine Methode aufruft, die nicht im Bezug eines Objektes steht bzw. nichts mit Objekten/Objektvariablen am Hut hat, dann muss die Methode static sein?!


Kann man grundsätzlich sagen, aber man sollte sich gerade am Anfang angewöhnen Objektorientiert zu programmieren auch wenn das static im Methodenkopf doch viel einfacher wäre.


----------



## Mr Mitbewohner (27. Sep 2013)

Die vorherige Antwort trifft es schon ganz gut. Ich habe ein weiteres Beispiel, das sich der vorhandenen Java-Funktionalität bedient, woran man es vlt. gut versteht:

Die Klasse 
	
	
	
	





```
Integer
```
 hat sowohl statische, als auch nicht statische Methoden. 

Die statischen können direkt an der Klasse aufgerufen werden, zum Beispiel 
	
	
	
	





```
Integer.valueOf()
```
:


```
String s = "1";
Integer i = Integer.valueOf(s);
```

Die nicht-statischen Methoden können nur an einem ganz bestimmten Integer ausgeführt werden, brauchen also einen konkreten Bezug. Zum Beispiel 
	
	
	
	





```
Integer.compareTo()
```
:


```
Integer i = 1;
int result = i.compareTo(2);
```

Hilft das beim Verständnis ein wenig? 

Nice to know:
Hat eine bestimmte Klasse NUR statische Methoden, die also keine bestimmte Instanz von sich (ein Objekt) benötigen, heißen sie Factory. Factories haben meist viele hilfreiche Funktionen, die aber allgemeiner Natur sind. Man muss das Objekt, was bearbeitet werden soll, also als Parameter erst hinein geben und führt die Methode nicht direkt auf jenem Objekt aus.


----------



## geqoo (27. Sep 2013)

Mr Mitbewohner hat gesagt.:


> Nice to know:
> Hat eine bestimmte Klasse NUR statische Methoden, die also keine bestimmte Instanz von sich (ein Objekt) benötigen, heißen sie Factory. Factories haben meist viele hilfreiche Funktionen, die aber allgemeiner Natur sind. Man muss das Objekt, was bearbeitet werden soll, also als Parameter erst hinein geben und führt die Methode nicht direkt auf jenem Objekt aus.



Als Ergänzung dazu als "nice to know" gibt es neben der Factory auch noch den Singleton.
Dieser muss zwar im Gegensatz zur Factory nicht nur aus statischen Methoden bestehen, tut es aber meistens. Das Singleton ist ein Entwurfsmuster, womit man nur eine einzige Instanz einer Klasse zulässt.

Interessant ist so etwas z.B. für Logger. Die werden nur einmal instanziert (dürfen auch nur 1x instanziert werden) und sind dann i.d.R. über statische Methoden verwendbar, da du in den Logger ja nichts reinbasteln sollst, sondern ihn nur verwenden sollst.


----------



## Mr Mitbewohner (27. Sep 2013)

Nicht ganz. Hätte ein Singleton NUR statische Methoden, könnte man genauso gut eine Factory nehmen. ;-) Singleton heißt, es darf nur einmal existieren. Aber dann hat es mit Sicherheit Methoden, die nicht statisch sind, also diese eine Instanz für ihre Funktion benötigen. Sonst könnte man sich den Singleton-Aufwand sparen.

Zur Erläuterung: Singleton heißt Einzelstück und hat normalerweise eine statische Methode 
	
	
	
	





```
getInstace()
```
, die genau diese eine Instanz zurückliefert ODER sie anlegt, sollte es noch keine geben.


----------



## koma (27. Sep 2013)

So viel Halbwissen/Blödsinn auf einem Haufen ist ja echt nicht zum Aushalten.



Mr Mitbewohner hat gesagt.:


> Nice to know:
> Hat eine bestimmte Klasse NUR statische Methoden, die also keine bestimmte Instanz von sich (ein Objekt) benötigen, heißen sie Factory. Factories haben meist viele hilfreiche Funktionen, die aber allgemeiner Natur sind. Man muss das Objekt, was bearbeitet werden soll, also als Parameter erst hinein geben und führt die Methode nicht direkt auf jenem Objekt aus.



Das ist ja mal ein kompletter Blödsinn. Wo bitte ist java.lang.Math eine Factory, was erzeugt denn bitte diese Factory.  Waere ja nicht so als koennte man den Sinn einer Factory durch uebersetzen verstehen. Wenn man schon wissen will was eine Factory genau ist koennte man vorher vl googlen ueber Factory-Pattern. Wenn man für Klassen die nur statische Methoden aufweisen einen Namen geben moechte, dann sollte passt vl am ehesten Utiltiy-Klasse aber selbst das ist nur kontext abhaengig erlaubt.  



geqoo hat gesagt.:


> Als Ergänzung dazu als "nice to know" gibt es neben der Factory auch noch den Singleton.
> Dieser muss zwar im Gegensatz zur Factory nicht nur aus statischen Methoden bestehen, tut es aber meistens. Das Singleton ist ein Entwurfsmuster, womit man nur eine einzige Instanz einer Klasse zulässt.
> 
> Interessant ist so etwas z.B. für Logger. Die werden nur einmal instanziert (dürfen auch nur 1x instanziert werden) und sind dann i.d.R. über statische Methoden verwendbar, da du in den Logger ja nichts reinbasteln sollst, sondern ihn nur verwenden sollst.


Gerade Logger sind nicht die besten Bsp. für Singeltons, da man oft nicht nur einen Logger hat.
Was sonst noch so an dieser Aussage falsch ist hat eh Mr Mitbbewohner erklärt



Mr Mitbewohner hat gesagt.:


> Nicht ganz. Hätte ein Singleton NUR statische Methoden, könnte man genauso gut eine Factory nehmen. ;-) Singleton heißt, es darf nur einmal existieren. Aber dann hat es mit Sicherheit Methoden, die nicht statisch sind, also diese eine Instanz für ihre Funktion benötigen. Sonst könnte man sich den Singleton-Aufwand sparen.
> 
> Zur Erläuterung: Singleton heißt Einzelstück und hat normalerweise eine statische Methode
> 
> ...



Also die Qulität des Forums hat ja echt nachgelassen. Schade


----------



## Mr Mitbewohner (27. Sep 2013)

koma hat gesagt.:


> So viel Halbwissen/Blödsinn auf einem Haufen ist ja echt nicht zum Aushalten.
> ...
> Also die Qulität des Forums hat ja echt nachgelassen. Schade



Da gebe ich dir Recht. Statt sachlich zu verbessern, motzt du lieber rum. :-(

Recht gebe ich dir hier: Es dürfte nicht *Factory* heißen, weil der Begriff belegt ist. Umgangssprachlich nutzen den aber irgendwie ziemlich viele für eine rein statische *Utility-Klasse*. 

Nach nochmaligem Durchlesen unserer und deines Posts komme ich zu dem Schluss, dass mein einziger Fehler die Bezeichnung "Factory" war. Und den Irrtum mit der Verwendung des Singleton habe ich schon versucht aufzuklären. Also kein Grund zur Aufregung.


----------

