this
用作引用变量,但super
没有,为什么?
例:
我们可以做System.out.println("this: " + this);
但我们永远不能做System.out.println("Super: " + super);
class Base
{
public Base()
{
System.out.println("Base Constructor");
}
}
class Child extends Base
{
public Child()
{
System.out.println("Child Constructor");
System.out.println("this: " + this);
//System.out.println("Super: " + super);
}
}
我想到的原因是,当我们使用new
关键字时,会在堆中分配内存,并且该内存的引用ID保存在this
中。但是堆中的父级没有内存空间分配,因此没有参考ID存储在super
中。
我错了吗?或者有什么遗漏。我们可以说this
是一个参考变量& super
不是吗?
答案 0 :(得分:3)
由于编译器会将this
存储在插槽0的本地变量表中。
请参阅以下代码:
public void t(){
System.out.println(this);
}
,字节代码为:
public void t();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: invokevirtual #3 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
7: return
LineNumberTable:
line 81: 0
line 82: 7
LocalVariableTable:
Start Length Slot Name Signature
0 8 0 this Lcom/zhuyiren/Main;
在JVMS 2.6.1 Local Variables
中,有一些解释:
在实例方法调用中,局部变量0总是用于传递对调用实例方法的对象的引用(这在Java编程语言中)
答案 1 :(得分:3)
Java中的super
关键字不是对象引用,与 this
不同。 this
用作对调用对象的引用。但是,super是用于解析父类的关键字。方法和数据成员。 super
指向父类。但是,this
指向调用对象。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@'”以及哈希代码的无符号十六进制表示形式组成。对象
这就是您可以打印对象的原因。但是你无法打印super
。
答案 2 :(得分:1)
是的,没错。没有可以存储在super
中的参考ID,这就是我们无法打印它的原因。 super
只是一个用于访问父数据成员/构造函数的关键字。