Statische Methoden

M4D-M4X

Bekanntes Mitglied
Hi Leute,

könnt ihr mir vllt. genau erklären wofür man statische Methoden braucht, bzw. wie das genau funktioniert?
Das Tutorial hier im Forum aus dem Forum und die Beschreibung im Openbook hab ich auch schon gelesen.

Das einzige was ich davon jetzt mitgenommen habe ist, dass statische Methoden nicht über Instanzen aufgerufen werden, sondern direkt und dies kann überall im Programm geschehen, aber das kann doch noch nicht alles sein oder?

Jetzt ist meine Frage, man kann statische Methoden doch nicht überall aufrufen oder? Habs grad selber probiert mit 2 Klassen aber hat nicht wirklich hingehauen.

Bitte erklärt es mir :eek:
 

XHelp

Top Contributor
Wie hast du es probiert? Statische Methoden kannst du auch über die Instanzen aufrufen.
Und überall im Programm... hmmm... du kannst auch
Code:
private static
machen, dann kannst du die nicht überall aufrufen.
 

nrg

Top Contributor
Stell dir deine Klasse vor wie ein Stempel. Alles was nicht statisch ist, wird abgestempelt. D.h. du erzeugst eine Instanz mit new DeineKlasse() und bekommst in dieser Instanz alles was nicht statisch ist. Alles statische gibt es nur ein einziges mal in deiner Klasse. D.h. alle Instanzen deiner Klasse (ob das nun eine oder 100 sind) haben die gleichen statischen Methoden und Attribute!

Java:
public class Test {
	
	static int statisch;
	int nichtStatisch;
	
	public Test() {
		statisch++;
		nichtStatisch++;
	}
	
	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test();
		
		System.out.println(t1.nichtStatisch);		// 1, weil Inszanzvariable
		System.out.println(t2.nichtStatisch);		// 1, weil Instanzvariable
		System.out.println(Test.statisch);			// 2, weil 2x instanziiert
		System.out.println(Test.nichtStatisch);  	// Geht nicht - MUSS instanziiert werden
	}
}
 

XHelp

Top Contributor
dafür geht aber:
Java:
System.out.println(t1.statisch);
Hat aber immer noch den Wert von 2.
 

nrg

Top Contributor
Also ich wüsste nicht, warum man statische Methoden vermeiden sollte. Utility (z.B. Math) bzw. Klassen, die nur eine Definition haben (Locale, Configs) halte ich schon für sinnvoll statisch und abstrakt zu halten. Oder kannst du deine Aussage präzisieren?
Ist halt vorteilhaft, weil man dadurch irgendwo den Wert zuweißen kann (Propertiesinitialisierung) und irgendwo wieder auslesen kann (Process). Natürlich solle man dabei die Kopplung möglichst gering halten.
 

XHelp

Top Contributor
Ja, aber du kannst die sinnvoll einsetzen, wenn du den ganzen Sinn darin verstanden hast. Ansonsten kommen Programme nur mit static-Methoden raus, weil ja die main schon static ist.
 

Andi_CH

Top Contributor
Statische Methoden solltest du vermeiden, sobald du welche davon überschreiben willst.
Bis ich das erste mal begriffen habe warum in meine Methode B.funktionDrei() nicht aufgerufen wurde, dauerte es eine Weile.

Java:
package ch.andi.demo;

public class A {
	public static void funktionEins() {
		System.out.println("A Eins");
		funktionZwei();
	}
	public static void funktionZwei() {
		System.out.println("A Zwei");
		funktionDrei();
	}
	public static void funktionDrei() {
		System.out.println("A Drei");
	}
}
Java:
package ch.andi.demo;

public class B extends A {
	public static void funktionEins() {
		System.out.println("B Eins");
		funktionZwei();
	}
	public static void funktionDrei() {
		System.out.println("B Drei");
	}
}
Java:
package ch.andi.demo;

public class DemoStatic {
	public static void main(String[] args) {
		System.out.println("Aufruf von A.funktionEins");
		A.funktionEins();
		System.out.println("Aufruf von B.funktionEins");
		B.funktionEins();
	}
}
Code:
Aufruf von A.funktionEins
A Eins
A Zwei
A Drei
Aufruf von B.funktionEins
B Eins
A Zwei
A Drei

Wenn die Funktionen nicht statisch definiert und der Aufruf angepasst ist, wird natürlich shön brav
Code:
Aufruf von b.funktionEins
B Eins
A Zwei
B Drei
ausgegeben

Das ist der mühsamste Unterschied
 

Marco13

Top Contributor
Es ist nur eine Warnung. Es ist eine statische Methode, und die "sollte" man statisch aufrufen.
Ich habe schon oft genug Code in der Form
Java:
Utility utility = new Utility();
utility.callSomeStaticMethod();
gesehen, wo ein Objekt instantiiert wurde, um eine statische Methode aufzurufen :autsch: (Reine Utility-Klassen sollten dann aber auch nur einen privaten Konstruktor haben)
 

nrg

Top Contributor
sollte man halt nicht machen.

ein instanziierter Aufruf

[c]new MeineKlasse().meineStatischeMethode();[/c]

und ein statischer Aufruf

[c]MeineKlasse.meineStatischeMethode();[/c]

machen - wie XHelp schon sagte - genau das Gleiche. Nur ist es - ohne MeineKlasse zu kennen - auf den ersten Blick ersichtlich, dass es sich beim Zweiten um einen statischen Aufruf handelt.
 

Marco13

Top Contributor
ein instanziierter Aufruf

[c]new MeineKlasse().meineStatischeMethode();[/c]

und ein statischer Aufruf

[c]MeineKlasse.meineStatischeMethode();[/c]

machen - wie XHelp schon sagte - genau das Gleiche.

Java:
class MeineKlasse
{
    public static void meineStatischeMethode()
    {
        System.out.println("Hello");
    }

    public MeineKlasse()
    {
        System.exit(-666);
    }
}
 

Andi_CH

Top Contributor
Java:
Utility utility = new Utility();
utility.callSomeStaticMethod();
Ich wusste echt nicht dass das geht, bis ich es vorhin ausprobiert habe

Warum geht das nicht?
Java:
(b.getClass()).funktionEins();

-> The method funktionEins() is undefined for the type Class<capture#2-of ? extends B>

Declaration von getClass:
Java:
public final native Class<?> getClass();

(Ich gebs zu die Notation mit dem ? verstehe ich gar nicht, obwwohl ich der auch schon begegnet bin)
 

nrg

Top Contributor
@Marco13: naja. außer wenn natürlich im Konstruktor statische Attribute geändert werden, die VM ne Keule bekommt oder eine Exception fliegt :)
 

tfa

Top Contributor
Warum geht das nicht?
Java:
(b.getClass()).funktionEins();

-> The method funktionEins() is undefined for the type Class<capture#2-of ? extends B>
Ganz einfach: in der Klasse [c]Class[/c] gibt es diese Methode nicht. Du musst schon auf die konkrete Utility-Klasse verweisen, damit die Methode gefunden wird.
 

Andi_CH

Top Contributor
Ganz einfach: in der Klasse [c]Class[/c] gibt es diese Methode nicht. Du musst schon auf die konkrete Utility-Klasse verweisen, damit die Methode gefunden wird.

Ich will ja nicht darauf verweisen sondern die holen ;-) egal, das wäre ja auch ein krankes Konstrukt ;-)

Andererseits ist ja ganz klar definiert von welcher Klasse b ist - da habe ich jetzt aber ernsthaft erwartet, dass das auch aufgelöst werden kann.
 
B

bygones

Gast
Andererseits ist ja ganz klar definiert von welcher Klasse b ist - da habe ich jetzt aber ernsthaft erwartet, dass das auch aufgelöst werden kann.
erwarte nicht zuviel magic - und das ist auch gut so :)

statische methoden generell sollte man so gut wie geht vermeiden. Einzig legitime Stellen sind wenn man sich im Objektgraph in einem Blatt findet, also keine weitere Instanzierungen bzw Objektaufrufe mehr hat - bsp Math
 

Marco13

Top Contributor
statische methoden generell sollte man so gut wie geht vermeiden.

Das klingt ... ein bißchen zu pauschal. Ich habe eigentlich die Daumenregel "Methoden statisch machen, wenn man das ohne Aufwand machen kann, Fields statisch machen, wenn es nicht anders geht". Deine Erläuterungen im zweiten Teil gehen schon in diese Richtung: Wenn man eine Methode hat, die nicht auf Instanzvariablen arbeitet (und nicht polymorph verwendet werden soll) dann sollte man die IMHO static machen.
 
B

bygones

Gast
bewusst pauschal gemacht. In 9 von 10 fällen wird statisch falsch eingesetzt, daher meine Regel "generell erstmal nicht statisch", ausnahme ist dann erklärt.
 

Wuella

Mitglied
Statische Methoden solltest du vermeiden, sobald du welche davon überschreiben willst.
Bis ich das erste mal begriffen habe warum in meine Methode B.funktionDrei() nicht aufgerufen wurde, dauerte es eine Weile.

Java:
package ch.andi.demo;

public class A {
	public static void funktionEins() {
		System.out.println("A Eins");
		funktionZwei();
	}
	public static void funktionZwei() {
		System.out.println("A Zwei");
		funktionDrei();
	}
	public static void funktionDrei() {
		System.out.println("A Drei");
	}
}
Java:
package ch.andi.demo;

public class B extends A {
	public static void funktionEins() {
		System.out.println("B Eins");
		funktionZwei();
	}
	public static void funktionDrei() {
		System.out.println("B Drei");
	}
}
Java:
package ch.andi.demo;

public class DemoStatic {
	public static void main(String[] args) {
		System.out.println("Aufruf von A.funktionEins");
		A.funktionEins();
		System.out.println("Aufruf von B.funktionEins");
		B.funktionEins();
	}
}
Code:
Aufruf von A.funktionEins
A Eins
A Zwei
A Drei
Aufruf von B.funktionEins
B Eins
A Zwei
A Drei

Wenn die Funktionen nicht statisch definiert und der Aufruf angepasst ist, wird natürlich shön brav
Code:
Aufruf von b.funktionEins
B Eins
A Zwei
B Drei
ausgegeben

Das ist der mühsamste Unterschied


Ist doch klar, dass da:

Code:
Aufruf von B.funktionEins
B Eins
A Zwei
A Drei

rauskommt.
du rufst ja in funktionEins von B die geerbte methode funktionZwei von A auf, in der dann funktionDrei, auch von der Klasse A, aufgerufen wird.

Wenn du stattdessen in funktionEins von Klasse B direkt funktionDrei aufrufst, klappt das doch mit dem Überschreiben.
 

Andi_CH

Top Contributor
Nein es klappt eben NICHT so wie es IMHO sein SOLLTE!

Die funktionZwei() müsste nämlich funktionDrei() aus A oder B aufrufen, abhängig davon woher sie aufgerufen wurde! (In meinem Fall sind funktionZwei() und funktionDrei() protected)

Nimm alle static weg, instanziere die Klasse und schau an was dann ausgegeben wird... so müsste ich es haben.

Die Verkettung der Funktionen ist gegeben! (Bestehendes Projekt)
Es ist ein ganz kleiner Teil der bestehende funktionZwei der jetzt kontextabhängig geändert werden muss, also lagert man den doch aus -> funktionDrei() und überschreibt diese in der abgeleiteten spezialisierten Klasse B - so das was man sich von OO gewöhnt ist.

Nur ist static leider nicht OO :-(

Ich musste in der abstrakten Klasse ein if-Konstrukt einfügen, das mir beeinflusst welche funktionDrei() nun ausgeführt werden soll. funktionZwei() zu kopieren macht in diesem Fall absolut keinen Sinn, da sie sehr gross ist....
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
C nicht statische Methoden Java Basics - Anfänger-Themen 4
D statische generische Methoden Java Basics - Anfänger-Themen 3
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
S Zufallszahl (Statische Attribute und Methoden) Java Basics - Anfänger-Themen 10
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
A Statische Variable in Methoden Java Basics - Anfänger-Themen 7
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
A Stilfrage: statische Methoden und Attribute auf jeden Fall verhindern? Java Basics - Anfänger-Themen 5
H statische methoden und sichtbarkeit Java Basics - Anfänger-Themen 13
nadoria statische Methoden (Klassenmethoden) Java Basics - Anfänger-Themen 3
G Statische Methoden? Java Basics - Anfänger-Themen 2
kb statische methoden und throws exception Java Basics - Anfänger-Themen 2
N Unterschied statische Attribute u. Methoden <-> objekt Java Basics - Anfänger-Themen 4
S Statische Felder - statische Methoden Java Basics - Anfänger-Themen 2
D Statische und Nicht-Statische Methoden Java Basics - Anfänger-Themen 7
K Statische Methoden!? Java Basics - Anfänger-Themen 8
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
S Klassen statische Objekterzeugung vor Konstruktoraufruf??? Java Basics - Anfänger-Themen 6
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
N Auf statische Methode zugreufen Java Basics - Anfänger-Themen 9
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Statische Klasse => Flaschenhals? Java Basics - Anfänger-Themen 10
T Statische Arrays von Objekten Java Basics - Anfänger-Themen 2
B Java Programm ohne statische Main Methode aufrufen Java Basics - Anfänger-Themen 5
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
E statische Variable ändert sich Java Basics - Anfänger-Themen 7
P Klassen statische oder dynamische(?) Klasse Java Basics - Anfänger-Themen 3
A Nicht-statische Methode in einer statischen aufrufen Java Basics - Anfänger-Themen 10
A statische Arraylist Java Basics - Anfänger-Themen 6
Q Variablen Statische Variablen Java Basics - Anfänger-Themen 8
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
K Statische Bindung Java Basics - Anfänger-Themen 6
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
L Methoden Auf statische Methode einer anderen Klasse zugreifen, die Array zurückgibt Java Basics - Anfänger-Themen 3
S statische Methode nebenläufig Java Basics - Anfänger-Themen 2
R Aufruf statische Methode Java Basics - Anfänger-Themen 7
C Relativer Pfad - Statische Methode Java Basics - Anfänger-Themen 6
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
sqsh statische jlabels dynamisch verwalten Java Basics - Anfänger-Themen 2
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
E Statische Member können nicht vererbt werden? Java Basics - Anfänger-Themen 10
B statische Variable Java Basics - Anfänger-Themen 10
M Statische und nicht-statische Funktionen: Desktop.browse(uri); Java Basics - Anfänger-Themen 4
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
H Statische generische Methode Java Basics - Anfänger-Themen 2
A statische Attribute: Vererbung und Zugriff darauf Java Basics - Anfänger-Themen 15
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
hdi statische synchronisation Java Basics - Anfänger-Themen 6
G statische ArrayList? Java Basics - Anfänger-Themen 8
K Statische Variablen von Objekten im Array Java Basics - Anfänger-Themen 15
K nicht-statische Methode aufrufen Java Basics - Anfänger-Themen 3
S statische variable initialisieren mit exception Java Basics - Anfänger-Themen 2
G statische Variable zugreifen bzw. setzen Java Basics - Anfänger-Themen 6
T in statischem Kontext auf nicht statische Variable beziehen Java Basics - Anfänger-Themen 5
M Statische Funktion Java Basics - Anfänger-Themen 2
M öffentliche nicht-statische Funktion fremder Klasse ausführn Java Basics - Anfänger-Themen 16
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
P nicht statische methode instantiieren Java Basics - Anfänger-Themen 7
K statische variablen und methode Java Basics - Anfänger-Themen 3
H Was ist nocheinmal eine statische Klasse? Java Basics - Anfänger-Themen 6
H statische, dynamischer Typ von Variablen Java Basics - Anfänger-Themen 1
M Konstruktor eine statische Methode? Java Basics - Anfänger-Themen 9
H statische,dynamische Bindung Java Basics - Anfänger-Themen 4
O nicht-statische Inhalte auf statische Inhalte verweisen Java Basics - Anfänger-Themen 19
M wann statische klassen? Java Basics - Anfänger-Themen 14
U statische Variablen Java Basics - Anfänger-Themen 12
F Statische Methode - Nicht Statische Methode Java Basics - Anfänger-Themen 10
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben