was ist den dieses zur Kompilierzeit und zur Laufzeit in Java?

Harry05

Bekanntes Mitglied
Ist damit Kompilierzeit und zur Laufzeit Abhängigkeit gemeint? ->nur extra

Hi, was ist den dieses zur Kompilierzeit und zur Laufzeit in Java ? was bringt mir es als Vorteil dieses zu verstehen?
Ich habe hier mal eine Anki Gedächtnis Stütze Gemacht Nur Ich Verstehe Diese Nicht Vollkommen.

[CODE lang="java" title="Virtuelle methode"]
public class Bird {
public String getName() {
return "Unknown";
}
public void displayInformation() {
System.out.println("The bird name is: "+getName());
}
}
public class Peacock extends Bird {
public String getName() {
return "Peacock";
}
public static void main(String[] args) {
Bird bird = new Peacock();
bird.displayInformation();
}
}[/CODE]

Wie Sie in ähnlichen Beispielen im Abschnitt "Überschreiben einer Methode" gesehen haben, wird die Methode getName() in der kindsklasse Peacock überschrieben. Noch wichtiger ist jedoch, dass der Wert der Methode getName() zur *Laufzeit* in der Methode displayInformation() durch den Wert der Implementierung in der kinderklasse Peacock ersetzt wird. Mit anderen Worten: Auch wenn die Elternklasse Bird ihre eigene Version von getName()
definiert und zur *Kompilierzeit* nichts über die Peacock-Klasse weiß, verwendet die Instanz zur *Laufzeit* die überschriebene Version der Methode, wie sie auf der Instanz des Objekts definiert ist. Wir betonen diesen Punkt, indem wir in der main()-Methode eine Referenz auf die Bird-Klasse verwenden, obwohl das Ergebnis bei Verwendung einer Referenz auf Peacock dasselbe gewesen wäre. Sie kennen nun den wahren Zweck des Überschreibens einer Methode und wissen, wie es mit dem Polymorphismus zusammenhängt. Es liegt in der Natur des Polymorphismus, dass ein Objekt viele verschiedene Formen annehmen kann. Indem Sie Ihr Verständnis von Polymorphismus mit Methodenüberschreibung kombinieren, sehen Sie, dass Objekte zur *Laufzeit* auf sehr unterschiedliche Weise interpretiert werden können, insbesondere in Methoden, die in den Elternklasse der Objekte definiert sind.


Ich frage im rahmen der OCA Prüfung
 
Zuletzt bearbeitet:
Kompilierzeit = Zeitpunkt des Kompilierens der Anwendung
Laufzeit = Zeitpunkt, an dem deine Anwendung läuft bzw. ausgeführt wird

Wenn dir der Begriff "Kompilieren" (bzw. engl. "compile") nichts sagt, dann google einmal danach.
Bezogen auf Java ist es der Prozess des Umwandelns einer Compilation Unit (.java Datei) in eine oder mehrere .class Dateien. Dieses Kompilieren passiert eben zur Kompilierzeit.

Diese dabei entstandenen .class Dateien können dann von der JVM ausgeführt werden, und der Zeitpunkt, an dem dies geschieht, wird eben Laufzeit genannt.

Bei Sprachen mit Polymorphie wird da gerne der Unterschied zwischen Kompilierzeit und Laufzeit hervorgehoben, weil zur Kompilierzeit eben noch nicht feststeht, welches Verhalten ein Code zur Laufzeit tatsächlich an den Tag legt.

Zum Beispiel einfach folgende Methode (gemäss deinem Beispiel):
Java:
public static void main(String[] args) {
  Bird bird;
  if (heuteIstMontag()) {
    bird = new Bird();
  } else {
    bird = new Peacock();
  }
  bird.displayInformation();
}
Zur Kompilierzeit kann man hier nicht sagen, was genau passiert. Es hängt davon ab, _wann_ der Code ausgeführt wird und nicht, wann er kompiliert (von .java -> .class Datei übersetzen) wird.

Oder noch ein einfacheres Beispiel:
Java:
public class EineKlasse {
  public static void meineMethode(Bird bird) {
    bird.displayInformation();
  }
}
Wenn diese Klasse kompiliert wird, weiss man zur Kompilierzeit ja nicht, was genau passiert.
Es hängt vom Laufzeittyp des Objektes (Parameter) ab.
 
Wobei Kompilierzeit auch (zumindest im sprachlichen Umgang) auch die Zeit vor dem Kompilieren mit einschließt. Es ist die Zeit, wo du Änderungen an deinem Code vornehmen kannst.

Zur Laufzeit (=wenn das Programm läuft) kannst du das nicht mehr.

Praktisch wichtig ist das z.B. wenn du Probleme abfangen willst, die du zur Kompilierzeit oder davor nicht unbedingt hast: Datei nicht gefunden, Netzwerkverbindung abgebrochen, Server nicht erreichbar, Empfangene Daten korrumpiert, ... und du deinem Programm beibringen willst, in freier Wildbahn trotzdem zu funktionieren. Irgendwie mußt du in deiner eigenen Überlegung, aber auch in der Kommunikation mit anderen ja diesen Punkt ausdrücken können wann du noch an deinem Programm schreibst und wann es läuft.
 
Manche Fehler können bereits zur "Kompilierzeit" vom Compiler erkannt werden. Das sind z. B. einfache Syntaxfehler, wie vergessene Semikolon oder geschweifte Klammern. Oder Zuweisungen, die offensichtlich nicht möglich sind (sog. Typsicherheit).
Java:
Bird bird = 42; // Fehler!

Manche Fehler treten allerdings auch erst zur Laufzeit auf (@White_Fox hat schon einige Beispiele genannt) und müssen vom Programmierer berücksichtigt werden.
Java:
public static void main(String[] args) {
    Bird bird = getBirdFromCage(); // falls der Käfig leer war, dann enthält "bird" möglicherweise den Wert null
    letFly(bird);
}

public static void letFly(Bird bird) {
    bird.fly(); // Null Pointer Exception, weil "bird" keine gültige Referenz enthält
}

public static Bird getBirdFromCage() {
    // Code, der irgendwie einen Bird aus dem Käfig zurückgeben möchte
}
 

Zurück
Oben