2012-08-22 19 views
26

Javadoc menciona que la clase Object tiene un constructor público no-arg. Pero el código fuente de Object no tiene ningún constructor explícito. Entonces, obviamente, el compilador generó uno para eso. Sin embargo, si veo el seguimiento de la pila de llamadas cuando un constructor está a punto de regresar (como se muestra a continuación), no veo ninguna llamada al Object.<init> en ese rastreo.Java: ¿la clase Object tiene un constructor?

Entonces la pregunta es, ¿la clase Object tiene un constructor predeterminado como dice el documento? En caso afirmativo, ¿por qué no lo veo en el seguimiento de la pila de llamadas?

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

Resultado:

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

hmm de http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html Todas las clases tienen al menos un constructor. Si una clase no declara explícitamente , el compilador de Java proporciona automáticamente un constructor sin argumento , llamado el constructor predeterminado. Este valor predeterminado es el constructor de Objetos si la clase no tiene otro padre. – MimiEAM

+1

¿Es posible aceptar más de una respuesta? Porque me gustaría aceptar las 4 respuestas dadas a continuación. – shrini1000

Respuesta

24

constructores Súper se ejecutan antes que los constructores sub/base. En su ejemplo, el constructor de Objetos ya se ejecutó cuando se ejecuta new Throwable().printStackTrace().

Una versión más explícita de su código:

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

que no se ve en el seguimiento de la pila, porque ya fue llamado. La excepción se arroja en su código.

Su código es equivalente a la escritura:

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

Usted no lo ve en el seguimiento de la pila porque el constructor de la superclase se llama antes de su llamada new Throwable().printStackTace(). Lo que el compilador realmente crea es lo siguiente.

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

como se sugirió anteriormente super() es la primera llamada en el constructor y para el método Más información here

Al compilar una clase, el compilador Java crea un método de instancia inicialización para cada constructor que declarar en el código fuente de la clase. Aunque el constructor no es un método, el método de inicialización de la instancia sí lo es. Tiene un nombre, <init>, un tipo de retorno, vacío, y un conjunto de parámetros que coinciden con los parámetros del constructor de la cual fue generada

5

Sí, clase de objetos tienen un constructor por defecto como dice el doc.

Como saben INSTED de hacer eso se puede comprobar mediante el uso de javap concurso de -c en el símbolo del sistema se puede ver que está llamando al constructor por defecto clase de objeto() por debajo es de código Línea Nº: 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 

} 

Gracias

Cuestiones relacionadas