Falconbyte unterstüzen
Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.
Thema in Kurzform
- Statische Variablen und Methoden benötigen keine Objekte, um eingesetzt zu werden. Sie werden in den Klassen selbst gespeichert.
- Um eine statische Variable oder Methode zu definieren, verwenden wir das Schlüsselwort static direkt hinter dem Modifier.
- Wenn wir eine statische Variable als unveränderliche Konstante festlegen wollen, ergänzen wir noch das Schlüsselwort final.
- Statische Variablen
- Statische Methoden
- Übungen
Inhaltsverzeichnis
Statische Variablen
Statische Variablen unterscheiden sich von Instanzvariablen dadurch, dass sie unabhängig von einem Objekt (Instanz) existieren und stattdessen in der Klasse selbst gespeichert werden. Statische Variablen werden deshalb auch Klassenvariablen genannt.
Um eine Variable als statisch festzulegen, schreiben wir bei der Variablendeklaration das Keyword static hinter den Modifier. Zum Beispiel:
private static double preis = 3.50;
Sehen wir uns eine statische Variable innerhalb einer Klassendefinition an:
public class Cappuccino {
private static double preis = 3.50;
public void setPreis(double preis){
this.preis = preis;
}
}
Bereits jetzt, ohne dass schon Objekte der Klasse Cappuccino erzeugt wurden, ist die statische Variable preis existent. Erzeugen wir nun Objekte der Klasse Cappuccino, können all diese Objekte auf die gemeinsame statische Variable zugreifen. Testen wir das mal:
public class CappuccinoTest {
public static void main(String[] args){
Cappuccino c1 = new Cappuccino();
Cappuccino c2 = new Cappuccino();
Cappuccino c3 = new Cappuccino();
c1.setPreis(3.00); // preis = 3.00
c2.setPreis(1.50); // preis = 1.50
c3.setPreis(1.00); // preis = 1.00
}
}
Jedes der drei Cappuccino-Objekte ruft nacheinander die Methode setPreis() auf und jedes Mal wird der Wert der statischen Variablen preis entsprechend verändert. Die Objekte der Klasse Cappuccino teilen sich also die Klassenvariable.
In einer Grafik stellt sich das Verhältnis zwischen der Klassenvariablen und den drei Objekten so dar:
public machen
Haben wir aber nicht gesagt, dass wir für statische Variablen keine Objekte brauchen, da die Variable in der Klasse gespeichert wird? Wie können wir aber ohne Methodenaufruf auf Objekten die Klassenvariable benutzen?
Tatsächlich können wir (ganz ohne Objekte erzeugen zu müssen) mit folgender Schreibweise auf die Klassenvariable direkt zugreifen:
Klassenname.Variablenname
Damit das auch wirklich funktioniert, darf die Sichtbarkeit der statischen Variablen aber nicht private sein. Ein Zugriff darauf ist nämlich ohne entsprechende Methode von außerhalb der Klasse ja eben nicht möglich.
Setzen wir die statische Variable also auf public:
public static double preis = 3.50;
Jetzt können wir auch von anderen Klassen aus (ohne Methodenaufruf) auf die Klassenvariable zugreifen:
public class CappuccinoTest {
public static void main(String[] args){
Cappuccino.preis = 4.50;
System.out.println(Cappuccino.preis); // 4.50
}
}
Achtung: Wir sollten uns immer gut überlegen, wie wir die Zugriffsstufe festgelegen. Zwar können wir mit public von überall auf die Klassenvariable zugreifen. Das bedeutet aber gleichzeitig auch ein erhöhtes Risiko für die Programmintegrität, da die Variable nicht mehr "geschützt" ist und ein ungewollter Zugriff auf die Klassenvariable jederzeit erfolgen kann.
Konstanten erstellen mit final
Wenn wir den Wert einer statischen Variablen so festsetzen wollen, dass er nicht mehr verändert werden kann, können wir die Variable als unveränderliche Konstante definieren. Hierzu schreiben wir das Schlüsselwort final direkt hinter static. Die Klassenvariable preis sieht als Konstante dann so aus:
public static final double PREIS = 3.50;
Beachten Sie: Konstanten müssen sofort initialisiert werden. Das heißt: Deklaration und Initialisierung müssen in einem Schritt (in einer Anweisung) erfolgen.
Da final endgültig heißt, kann der Initialisierungswert der Variable nicht mehr verändert werden. Versuchen wir es dennoch, erhalten wir einen Compiler-Fehler:
public class CappuccinoTest {
public static void main(String[] args){
Cappuccino.PREIS = 4.50; // Fehler: Konstante darf nicht verändert werden!
}
}
Konstanten werden außerdem immer in Großbuchstaben geschrieben. Diese Konvention ist guter Stil und dient zur Hervorhebung der Konstanten im Quellcode.
Statische Methoden
Mit dem Keyword static können wir nicht nur statische Variablen, sondern auch statische Methoden erzeugen.
Die Sache verhält sich dann analog zu Instanz- bzw. Klassenvariablen: Instanzmethoden benötigen ein Objekt, um aufgerufen werden zu können. Dagegen beziehen sich statische Methoden auf die Klasse und benötigen zur Ausführung daher kein Objekt (deshalb auch Klassenmethode genannt).
Um eine Methode als statische Klassenmethode festzulegen, schreiben wir das Schlüsselwort static direkt hinter den Zugriffsmodifier. Also:
public static void statischeMethode(){
System.out.println("Ich bin eine statische Methode der Klasse Cappuccino");
}
Aufgerufen wird die Klassenmethode sodann nach folgendem Muster:
Klassenname.Methodenname();
public class CappuccinoTest {
public static void main(String[] args){
Cappuccino.statischeMethode(); //Aufruf der statischen Methode
}
}
Wussten Sie schon? In jedem Java-Programm gibt es übrigens mindestens eine statische Methode. Es handelt sich dabei um die Ihnen bereits bekannte Main-Methode, die wir zum Starten des Programms benötigen.
Was statische Methoden nicht können
Wie wir gesehen haben, sind statische Methoden objektunabhängig. Das hat zur Folge, dass wir innerhalb statischer Methoden keine Instanzvariablen und Instanzmethoden aufrufen können. Diese benötigen ja zwingend ein Objekt. Der Compiler kann zum Zeitpunkt des Aufrufs der statischen Methode aber nicht davon ausgehen, dass ein solches Objekt auch wirklich existiert.
Der folgende Code lässt sich deshalb nicht kompilieren:
// ...
public static void statischeMethode(){
System.out.println("Ich bin eine statische Methode der Klasse Cappuccino");
setPreis(5.25);// Fehler!!
}
public void setPreis(double preis){ // Instanzmethode
preis = preis
}
// ...
Warum funktioniert der Code nicht? Wir versuchen in diesem Beispiel eine Instanzmethode innerhalb einer statischen Methode aufzurufen. Das kann aber, wie oben gesagt, nicht laufen. Auch ein Zugriff auf eine Instanzvariable dürfte innerhalb der statischen Methode nicht erfolgen.
Umgekehrt aber wäre das kein Problem. Um den Code wieder lauffähig zu machen, müssten wir entweder die statische Methode zu einer Instanzmethode bzw. die Instanzmethode zu einer statischen Methode umbauen.
Übungen
einfach
Was wird mit folgendem Code auf der Konsole geprinted?
public class Kaffee {
private static String marke;
public Kaffee(){
marke = "Zibu";
}
public static void main(String[] args){
Kaffee.marke = "Zibu2";
System.out.println(Kaffee.marke);
}
}
A. Fehler: Weil marke eine Konstante ist, muss sie unmittelbar beim Deklarieren einen Wert zugewiesen bekommen.
B. null
C. Zibu
D. Zibu2
mittel
Wieviele Fehler sind im folgenden Code?
public class Kaffee {
private double preis = 2.55;
public static final String MARKE = "Zibu";
public Kaffee(){
MARKE = "Eduxo";
}
private static String getInfos(){
return "Preis: " + preis +
"Marke: " + Kaffee.MARKE;
}
}
A. keiner
B. einer
C. zwei
D. drei
schwer
Kurz und knapp: Schreiben Sie eine Klasse, in der die Anzahl der erstellen Objekte dieser Klasse gespeichert wird.