2012-01-19 27 views
6

¿Cómo apunta el puntero this al objeto en sí? ¿Es una implementación de Java o es una implementación del compilador?¿Cómo se implementa la palabra clave "this" de java?

+0

Aquí es lo que podemos obtener más información sobre 'esto'. http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#251519 – kosa

Respuesta

1

Bueno, si usted está interesado, por qué no mirar el código de bytes generado por el compilador

class HelloWorld 
{ 
    private String hello = "Hello world!"; 

    private void printHello(){ 
    System.out.println (this.hello); 
} 

public static void main (String args[]){ 
    HelloWorld hello = new HelloWorld(); 
    hello.printHello(); 
} 

}

Compilar utilizando

% HelloWorld.java JAVA_HOME%/bin/javac

Obtener bytecode con

javap -c HelloWorl d

salida de editar añadir

enter code here 

HelloWorld(); 
Code: 
0: aload_0 
1: invokespecial #1; //Method java/lang/Object."<init>":() 
4: aload_0 
5: ldc  #2; //String Hello world! 
7: putfield  #3; //Field hello:Ljava/lang/String; 
10: return 

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

}

3

Suena como una pregunta filosófica. No estoy seguro de que haya una implementación de Java.

this se define en el JLS y es una palabra clave en Java y la compilación tiene que cumplir con ese estándar. Cuando se tiene un método como

object.method(args) 

lo que se llama en realidad en el código de bytes es un método que se parece a

method(object, args); 

donde this es el primer argumento.

A nivel JVM, los parámetros no tienen nombres y el JIT podrían optimizar el argumento de distancia si no es utilizado en realidad.

+0

:) No Peter. Me rebotó en la entrevista con la pregunta. Thot de echarle un vistazo. – mavrav

+0

A veces se obtienen preguntas mal redactadas en las entrevistas. Puede ser una señal de que el entrevistador tampoco sabe la respuesta, y solo quiere saber lo que usted dice. –

+1

¡A menos que la publicación implique que trabajes en una implementación de JVM, es una pregunta terrible! – vaughandroid

7

En el bytecode de JVM, la variable local (básicamente register 0) apunta al objeto actual cuando se invoca un método. El compilador simplemente usa this como un alias para la variable local 0.

Supongo que la respuesta es que el compilador implementa this.

Cuestiones relacionadas