2012-08-22 3 views
26

Javadoc упоминает, что класс Object имеет открытый конструктор no-arg. Но исходный код объекта не содержит в нем явного конструктора. Поэтому, очевидно, компилятор создал для него. Однако, если я вижу трассировку стека вызовов, когда конструктор вот-вот вернется (как показано ниже), я не вижу никакого вызова Object.<init> в этой трассе.Java: класс Object имеет конструктор?

Итак, вопрос в том, имеет ли класс объекта конструктор по умолчанию, как говорит документ? Если да, почему я не вижу его в трассировке стека вызовов?

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

Результат:

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

хмм от http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html Все классы имеют по крайней мере один конструктор. Если класс не явно объявляет, компилятор Java автоматически предоставляет конструктор no-argument , называемый конструктором по умолчанию. По умолчанию используется конструктор Object, если класс не имеет другого родителя. – MimiEAM

+1

Можно ли принять более одного ответа? Потому что я хотел бы принять все 4 ответа, приведенные ниже. – shrini1000

ответ

24

Супер Конструкторы выполняются до суб/базовых конструкторах. В вашем примере конструктор объекта уже запущен, когда выполняется new Throwable().printStackTrace().

Более явная версия кода:

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

Вы не видите его в трассировке стека, потому что это уже называется. Исключение выбрано в коде.

Ваш код эквивалентно записи:

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

Вы не видите его в трассировки стека, так как конструктор суперкласса вызывается до вашего new Throwable().printStackTace() вызова. То, что на самом деле создает компилятор, следующее.

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

Как было отмечено выше супер() первый вызов в конструкторе и метод получения более подробной информации here

При компиляции класса, компилятор Java создает метод инициализации экземпляра для каждого конструкторе объявить в исходном коде класса. Хотя конструктор не является методом, метод инициализации экземпляра. Она имеет имя, <init>, типа возвращаемого значения, недействительный, и набор параметров, которые соответствуют параметрам конструкторы, из которого он был создан

5

Да, класс объекта есть конструктор по умолчанию, как говорит доктор.

Как вы знаете, InstEd делать, что вы можете проверить его с помощью javap -c Contest в командной строке вы можете видеть, что это звонит конструктор класса объекта по умолчанию() в ниже код с в Line 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 

} 

Спасибо

Смежные вопросы