2012-08-22 11 views
26

Javadoc erwähnt, dass die Object-Klasse einen öffentlichen no-arg-Konstruktor hat. Aber der Quellcode von Object enthält keinen expliziten Konstruktor. Also hat der Compiler offensichtlich einen dafür erzeugt. Wenn ich jedoch die Call-Stack-Ablaufverfolgung sehe, wenn ein Konstruktor im Begriff ist zurückzugeben (wie unten gezeigt), sehe ich keinen Aufruf an in dieser Ablaufverfolgung.Java: Hat die Objektklasse einen Konstruktor?

Die Frage ist also, hat Object-Klasse einen Standardkonstruktor wie das Dokument sagt? Wenn ja, warum sehe ich es nicht im Call-Stack-Trace?

public ConTest() 
{ 
    new Throwable().printStackTrace(); 
} 

Ergebnis:

java.lang.Throwable 
    at ConTest.<init>(ConTest.java:8) 
    at ConTest.main(ConTest.java:16) 
+1

hmm von http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html Alle Klassen mindestens einen Konstruktor haben. Wenn eine Klasse nicht explizit deklariert, stellt der Java-Compiler automatisch einen Konstruktor ohne Argumente zur Verfügung, der als Standardkonstruktor bezeichnet wird. Dies ist der Object-Konstruktor, wenn die Klasse kein anderes übergeordnetes Objekt hat. – MimiEAM

+1

Ist es möglich, mehr als eine Antwort zu akzeptieren? Weil ich alle 4 Antworten akzeptieren möchte, die unten gegeben werden. – shrini1000

Antwort

24

Super-Konstruktoren werden vor sub/Basiskonstrukteurs laufen. In Ihrem Beispiel wurde der Konstruktor des Objekts bereits ausgeführt, wenn new Throwable().printStackTrace() ausgeführt wird.

Eine explizite Version des Codes:

public ConTest() 
{ 
    super(); 
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace. 
} 
6

Sie sehen es nicht in dem Stack-Trace, weil sie bereits genannt wurde. Die Ausnahme wird in Ihrem Code ausgelöst.

Ihr Code entspricht Schreiben:

public ConTest() { 
    super(); // this will call the Object constructor 
    new Throwable().printStackTrace(); 
} 
6

Sie sehen es nicht in dem Stack-Trace, da der Konstruktor der Superklasse, bevor Sie Ihren new Throwable().printStackTace() Aufruf aufgerufen wird. Was der Compiler tatsächlich erstellt, folgt.

public ConTest() 
{ 
    super(); // This is the call to the base class constructor 
    new Throwable().printStackTrace(); // already back from the base class constructor 
} 
2

Wie oben Super Suggested() im Konstruktor der erste Aufruf ist und für die Methode Weitere Informationen here

Wenn Sie eine Klasse kompilieren, erzeugt der Java-Compiler eine Methode Instanz Initialisierung für jeden Konstruktor Sie Deklarieren Sie im Quellcode der Klasse. Obwohl der Konstruktor keine Methode ist, ist die Instanzinitialisierungsmethode. Es hat einen Namen, <init>, einen Rückgabetyp, Leere, und eine Reihe von Parametern, die die Parameter des Konstruktors entsprechen, aus dem es

5

Ja, Objektklasse einen Standard-Konstruktor erzeugt wurde, wie der Arzt sagt.

Wie Sie wissen insted zu tun, dass Sie es, indem Sie javap -c ConTest in Eingabeaufforderung überprüfen Sie es ruft die Objektklasse Standardkonstruktors sehen kann() in unten ist Code der Linie No: 1

C:\stackdemo>javap -c ConTest 
Compiled from "ConTest.java" 
public class ConTest extends java.lang.Object{ 
public ConTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: new  #2; //class java/lang/Throwable 
    7: dup 
    8: invokespecial #3; //Method java/lang/Throwable."<init>":()V 
    11: invokevirtual #4; //Method java/lang/Throwable.printStackTrace:()V 
    14: return 

public static void main(java.lang.String[]); 
    Code: 
    0: new  #5; //class ConTest 
    3: dup 
    4: invokespecial #6; //Method "<init>":()V 
    7: astore_1 
    8: return 

} 

Danke

Verwandte Themen