Klassen statische Objekterzeugung vor Konstruktoraufruf???

Java:
class Hund extends Tiger {
    Katze m = new Katze("Tom");
    static Maus r = new Maus();

    Hund() {
        System.out.println("Hund");
    }

    public static void main(String[] args) {
        new Hund();
    }
}
Nehmt einfach an, dass es diese anderen Klassen auch gibt :)
Mir ist es neu, dass man ein Objekt als "Klassenobjekt" (siehe static Maus r = new Maus(); ) deklarieren kann.
Was bedeutet dieses static in Verbindung mit einer Objekterzeugung, da dies wohl normal sein soll?

2. Frage: Warum wird zuerst der Maus()-Konstruktor ausgeführt (dieser gibt auf der Konsole "Maus" aus) und erst danach "Hund"? Wahrscheinlich hängt die Antwort dieser Frage mit der ersten Frage zusammen ;D

Falls die weiteren KLassen gebraucht sind, kann ich sie euch zur Verfügung stellen, jedoch sollte meine Frage auch so klärbar sein:)
 
Zuletzt bearbeitet:
Deine erste Frage "Was bedeutet, dass da dies so stimmen soll?" verstehe ich nicht, da sie grammatikalisch nicht korrekt ist.
Zur zweiten Frage: Der Compiler generiert für statische Klassenvariablen, die bei der Deklaration initialisiert werden, eine separate Methode, die auch "Static Initializer" Blöcke beinhaltet, die als allerallerallererstes ausgeführt wird, direkt nachdem die Klasse geladen wurde und noch bevor irgendwelche anderen Methoden in dieser Klasse (inklusive der main() Methode) ausgeführt werden. Das sieht dann in etwa so aus:
Java:
class Hund extends Tiger {
    static Maus r;
    // durch Compiler generierte Methode mit komischem Namen:
    static void <clinit>() { // <--- wird zu allerallerallererst ausgeführt!
         r = new Maus();
    }
    Katze m = new Katze("Tom");

    Hund() {
        System.out.println("Hund");
    }

    public static void main(String[] args) {
        new Hund();
    }
}
 
Erschwerend hinzu kommt noch, dass die nicht den Konventionen entsprechende angegebene Reihenfolge von r und m vom Compiler berichtigt wird - sie aber dennoch zu vermeiden ist (nicht zuletzt der Lesefluss).
 
Deine erste Frage "Was bedeutet, dass da dies so stimmen soll?" verstehe ich nicht, da sie grammatikalisch nicht korrekt ist.
Zur zweiten Frage: Der Compiler generiert für statische Klassenvariablen, die bei der Deklaration initialisiert werden, eine separate Methode, die auch "Static Initializer" Blöcke beinhaltet, die als allerallerallererstes ausgeführt wird, direkt nachdem die Klasse geladen wurde und noch bevor irgendwelche anderen Methoden in dieser Klasse (inklusive der main() Methode) ausgeführt werden. Das sieht dann in etwa so aus:
Java:
class Hund extends Tiger {
    static Maus r;
    // durch Compiler generierte Methode mit komischem Namen:
    static void <clinit>() { // <--- wird zu allerallerallererst ausgeführt!
         r = new Maus();
    }
    Katze m = new Katze("Tom");

    Hund() {
        System.out.println("Hund");
    }

    public static void main(String[] args) {
        new Hund();
    }
}
1. Frage ist korrigiert und hast du auch im Grunde beantwortet.
2.Frage: Das erklärt also, warum ich im Debugger bei Eclipse trotz Setzen von Breakpoints, in der Konsole sofort die MAus-Ausgabe hatte :D DANKEEE
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben