Was genau ist Void und static bei Java?

4 Antworten

In Java wird void als "leerer" Datentyp verwendet. Das heißt, dass Methoden, die keinen Wert zurückgeben sollen, vom "leeren" Typ void sind. Jede Methode muss einen Rückgabetyp haben, deswegen haben diejenigen, die keinen Wert zurückgeben den Typ void.

Das Schlüsselwort static wird benutzt, um Klassen, Methoden und Variablen statisch zu machen. In der Objektorientierten Programmierung (OOP) muss immer ein Objekt von einer Klasse erzeugt werden, um auf Methoden und Eigenschaften zugreifen zu können.

Das Problem ist, wenn zwei Klassen miteinander kommunizieren wollen, dann haben beide ein anderes Objekt von der dritten Klasse. Statische Klassen, Methoden und Eigenschaften haben den Vorteil, dass man kein Objekt benötigt, um sie verwenden zu können.

System.out.prinln() ist eine solche Methode. Man braucht kein Objekt von System.out, um die println()-Methode aufrufen zu können. Ein weiterer Vorteil ist, dass man keine Objekte zerstören muss, um Speicher freigeben zu können.

Kurz: static ermöglicht die Verwendung von Methoden und Eigenschaften, ohne ein Objekt erzeugen zu müssen. Und void wird verwendet, wenn eine Methode keinen Wert zurückgeben soll.

Static

Es gibt eine Unterscheidung zwischen Inhalten, die bereits zu Programmstart geladen oder erst während der Programmlaufzeit erstellt werden. Erstere Inhalte werden als statisch deklariert.

Mit dem Schlüsselwort static kennzeichnest du zudem, was sich alle Objekte einer Klasse global teilen sollen. Das heißt, wenn du einer Klasse Tier ein statisches Attribut gibst, welches die Anzahl der Beine bestimmt und diese auf 4 setzt, hat jede Instanz der Klasse automatisch 4 Beine. Würde das Attribut aber an das Objekt gebunden (also nicht statisch deklariert) werden, könnte jedes Objekt selbst bestimmen, wie viel Beine es hat, ohne das sich die Anzahl bei den anderen existierenden Objekten mit ändert.

Da statische Inhalte an die Klasse gebunden sind, werden sie über den Namen der Klasse aufgerufen. Instanzgebundene Inhalte benötigen die Erstellung eines Objekts, um aufgerufen werden zu können.

class A {

public static int a;
public int b;
}

A.a = 1;
A objekt = new A(); // fuer b ist eine Instanz notwendig
objekt.b = 2;

Void

Laut Dokumentation http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html):

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void

Wenn du in einer Methode den Rückgabetyp (bzw. das Schlüsselwort) void angibst, bedeutet das, dass die Methode keinen Wert zurückgibt.

public void tuwas(){ // kein Rückgabewert erwartet
   // ...   
}

public int tuwas2(){ // ein Wert muss zurückgegeben werden return 1; }
PWolff  18.06.2017, 17:52

Soweit ich weiß, werden static-Members erst in dem Moment erzeugt, wo zum ersten Mal auf ein Member der definierenden Klasse zugegriffen wird. (Aber das ist letztlich eine Feinheit der Implementierung und nicht festgelegt, ob es so oder anders gehandhabt wird.)

1
regex9  18.06.2017, 18:03
@PWolff

Ja, das stimmt. Wenn die betreffende Klasse das erste Mal geladen wird, wird eine Prozedur ausgeführt, die sämtlichen statischen Inhalt bündelt und initialisiert. Statt Programmstart hätte ich Ausführungsbeginn o.ä. schreiben müssen.

0

Void => ein "leerer" Datentyp. Er signalisiert, dass die Methode keinen Rückgabewert hat und demzufolge auch kein return-Statement braucht

Beispiel:

void testVoid(){
  System.out.println("Test erfolgreich");
}

Im Gegensatz dazu kannst du auch angeben, dass die Methode einen gewissen Datentyp zurückgeben soll

int testNummer(){
  return 42;
}

Wenn du jetzt diese Methode aufrufst, bekommt der Aufrufer eine 42 zurück. 
---

static => etwas ist "statisch", kann also auch ohne zugehöriges Objekt aufgerufen werden. Angenommen, du hast folgende Variablen in deinem Code:

public class Test{
  static int a = 42;
  int b = 2;
}

Jetzt kannst du die Variable a in jeder beliebigen Methode (auch der Main-Methode) direkt verwenden. Für Variable b müsstest du erst ein Objekt der Klasse erstellen, um dann darauf zugreifen zu können.

System.out.println(a); // gibt 42 aus
Test tst = new Test();
System.out.println(tst.b); //gibt 2 aus

Die letzte Zeile ist btw unschön im Sinne der Objektorientierten Programmierung und dient nur hier fürs Beispiel - man sollte Direktzugriff auf Variablen vermeiden und es lieber über getter- und setter-Methoden verwalten

void: Void ist ein Rückgabeparameter, will heißen, wenn du eine Methode deklarierst, welche nichts zurückgibt, dann schreibst du wie folgt:

public void changeStatus(String newStatus){
   roboter1.status = newStatus;
}

Wenn du void bei einer Methodendeklaration NICHT benutzt, sähe das aus wie folgt:

public String getStatus(){
   return roboter1.status();
}

static: Static ist ein Zugriffsmodifizierer, will heißen, mit static zeigst du bei einer Methode oder einer Variable (oder Feld, Member, wie immer du es nennst) die Zugriffserlaubnis. static heißt dass die Methode oder Variable von Klasse a in Klasse b ohne Instanz von Klasse a benutzt werden darf. 

 class Roboter{
   public static String status;
}
class Manager{
   Roboter.status = "Unbeschäftigt";
}

Wäre die Variable status in der Klasse Roboter NICHT static, müsste der Code aussehen wie folgt:

class Roboter{
   public String status;
}
class Manager{
   Roboter roboter1 = new Roboter();
   
   roboter1.status = "Unbeschäftigt";
}

Ich hoffe ich konnte dir helfen, wenn du mehr fragen zum Thema Java oder Objektorientiertes Java hast, dann stelle die Frage einfach in ie gleiche Kategorie/n, ich werde dort so gut wie jeden tag schauen. 

MfG Malte

regex9  18.06.2017, 17:44

Static ist ein non-access modifier, denn er reguliert nicht den Zugriff auf die Variable oder Methode. Er entscheidet nicht, ob auf etwas zugegriffen werden kann, sondern eher wie.

Zugriffsmodifikatoren hingegen sind bspw. public, protected oder private.

0