Warum muss die Main-Methode statisch sein?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Du hast sonst ein Henne-Ei-Problem.

Zugriffsrechte betrachte ich im Folgenden nicht, main ist immer public.

Eine statische Methode kannst du immer aufrufen. Es muss keine Instanz der Klasse erzeugt sein, in der die main()-Methode ist.

Wenn nun die main()-Methode nicht statisch wäre, so könnte sie auf nicht-statische Member-Variablen zu einer Instanz der Klasse zugreifen. Aber welche Instanz soll das sein. Mit main() beginnt alles und erst wenn das aufgerufen wurde, kann mit new ...() eine Instanz erzeugt werden. Erst wenn diese Instanz da ist, kann man die main()-Methode zu der Instanz aufrufen, denn jede Instanz hat ihren eigenen Satz von Variablen.

Frei nach dem Motto: wasch mich, aber mach mich nicht nass.

Ruf mich auf, aber zaubere irgendwie eine Instanz der Klasse her, von der ich main() aufrufe?

Wenn main objektgebunden (also nicht statisch) wäre, würde man eine Instanz der Klasse benötigen, die diese Methode enthält. Wer aber sollte diese Instanz erstellen?

Weil das System sonst nicht weiss, welchen Konstruktor es nehmen soll, um die Instanz zu erstellen.

Woher ich das weiß:Studium / Ausbildung – Informatiker (Applikationsentwicklung) im ersten Lehrjahr

Kiritsugu87 
Beitragsersteller
 27.12.2019, 17:53

Was war noch gleich eine Instanz?

0
User339312  27.12.2019, 18:20

Instanzen kommen bei Objektorientierten Programmiersprachen zum Einsatz. Wenn ich zum Beispiel in einem Spiel die Klasse Gegner habe, dann könnte diese folgende Attribute aufweisen:

private String name;
private double maxhealth;
private double currentHealth;
private double locationX;
private double locationY;

Damit ich dann nicht für jeden Gegner eine neue Klasse erstellen muss, kommen Konstruktoren zum einsatz:

//Der Konstruktor
public Gegner(String name, double maxHealth, double locationX, double locationY) {
   //Jetzt definiere ich die Attribute dieses Objektes
   this.name = name; /* bei this wird immer das jetztige Objekt, also das Objekt, welches ich jetzt erstelle gewählt. */
   this.maxHealth = maxHealth;
   this.currentHealth = maxHealth;
   this.locationX = locationX;
   this.locationY = locationY;
}
//eine normale Methode
public void attack(Gegner gegner, double damage) {
   if(gegner == this) {
      /*Der Gegner kann sich selbst keinen Schaden zufügen, also wird die Methode abgebrochen*/
      return;
   }
   /*Wenn die Methode diesen Punkt erreicht, ist klar, dass der Gegner nicht versucht sich selbst zu attackieren, also werden dem übergebenen Gegner die Leben abgezogen*/
   gegner.setHealth(gegner.getHealth - damage);
}
//Ein setter
public double getHealth() {
   return this.currentHealth;
}
//Ein getter
public void setHealth(double health) {
   this.currentHealth = health;
}

Wenn ich also von woanders her zwei Gegner erstellen möchte, kann ich so vorgehen:

public void erstelleGegner() {
   /*Dieser Gegner bekommt den namen "gegner1", hat 10 Leben und erscheint bei der Position x=0, y=0 */
   Gegner gegner1 = new Gegner("gegner1", 10, 0, 0);

   /*Diesen Gegner nenne ich "Hero", er soll 50 Leben haben und bei x=5, y=7 erscheinen.
   Gegner gegner2 = new Gegner("Hero", 50, 5, 7)
}

Dank der Objektorientierten Programmiersprache Java musste ich jetzt nicht zwei Klassen machen, welche ich "Gegner1" und "Hero" nenne, sondern konnte das ganze schön relativ in einer Klasse machen.

0

Weil am Anfang eben Main gerufen wird und keine Instanz von Main erstellt wird.