this
指针如何指向对象本身?它是java实现还是编译器实现?
答案 0 :(得分:7)
在JVM字节码中,局部变量0 (基本上是寄存器0)在调用方法时指向当前对象。编译器只使用this
作为局部变量0的别名。
所以我猜答案是编译器实现了this
。
答案 1 :(得分:3)
听起来像是一个哲学问题。我不确定Java实现是什么。
this
在JLS中定义,是Java中的关键字,编译必须符合该标准。当你有像
object.method(args)
在字节代码中实际调用的是一个看起来像
的方法method(object, args);
其中this
是第一个参数。
在JVM级别,参数没有名称,如果没有实际使用,JIT可以优化参数。
答案 2 :(得分:1)
如果您有兴趣为什么不查看编译器生成的字节代码
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();
}
}
使用
进行编译%JAVA_HOME%/ bin / javac HelloWorld.java
使用
获取字节码javap -c HelloWorld
编辑添加输出
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
}