2012-08-22 16 views
26

Javadoc wspomina, że ​​klasa Object ma publiczny konstruktor no-arg. Ale kod źródłowy obiektu nie zawiera żadnego jawnego konstruktora. Więc oczywiście kompilator wygenerował dla niego jeden. Jednak jeśli widzę śledzenie stosu wywołań, gdy konstruktor ma zamiar zwrócić (jak pokazano poniżej), nie widzę żadnego połączenia z Object.<init> w tym śladu.Java: czy klasa Object ma konstruktor?

Pytanie brzmi, czy klasa Object ma domyślny konstruktor, jak mówi doc? Jeśli tak, dlaczego nie widzę go w śledzeniu stosu wywołań?

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

Wynik:

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

hmm od http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html Wszystkie klasy mają przynajmniej jeden konstruktor. Jeśli klasa nie zadeklaruje jawnie żadnej klasy, kompilator Javy automatycznie dostarcza konstruktor bezargumentowy , nazywany domyślnym konstruktorem. Ten domyślny konstruktor obiektu, jeśli klasa nie ma innego rodzica. – MimiEAM

+1

Czy można zaakceptować więcej niż jedną odpowiedź? Ponieważ chciałbym zaakceptować wszystkie 4 odpowiedzi podane poniżej. – shrini1000

Odpowiedz

24

Super konstruktorzy są prowadzone przed konstruktorami sub/bazowych. W twoim przykładzie Konstruktor obiektu został już uruchomiony po wykonaniu new Throwable().printStackTrace().

Bardziej wyraźne wersja kodu:

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

Nie widać go w ślad stosu, ponieważ została już wywołana. Wyjątek jest zgłaszany w kodzie.

Twój kod jest równoważne formie pisemnej:

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

Nie widać go w ślad stosu, ponieważ konstruktor super klasy nazywa się przed wezwanie new Throwable().printStackTace(). To, co faktycznie tworzy kompilator, następuje.

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

jak zasugerowano powyżej super() to pierwsze wywołanie w konstruktorze i metody Więcej informacji here

Podczas kompilowania klasę, kompilator Javy tworzy metodę instancji inicjalizacji dla każdego konstruktora ty zadeklaruj w kodzie źródłowym klasy. Mimo że konstruktor nie jest metodą, metoda inicjowania instancji jest. To ma swoją nazwę, <init>, typ zwracanej, nieważne i zestaw parametrów pasujących do parametrów konstruktora, z którego został on generowany

5

Tak, klasa obiektu posiada konstruktora domyślnego jak mówi doc.

jak wiesz insted robi, że można to sprawdzić za pomocą javap -c konkursie w wierszu polecenia widać to wywołanie konstruktora domyślnego klasy Object() w poniżej Kod w Linia nr: 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 

} 

Dziękuję

Powiązane problemy