java中的System.out.println(super)
java中的System.out.println(super),java,this,super,Java,This,Super,这个在java中用作参考变量,但是super没有,为什么? 例子: 我们可以做System.out.println(“this:+this”) 但是我们永远不能做System.out.println(“Super:+Super”) 我想到的原因是,当我们使用new关键字时,会在堆中分配内存,并且该内存的引用ID会保存在this中。但堆中没有为父级分配内存空间,因此在super中没有要存储的引用ID 我错了吗?或者我缺少什么。所以我们可以说这是一个参考变量&super不是吗?是的,没错。没有可存储
这个
在java中用作参考变量,但是super
没有,为什么?
例子:
我们可以做System.out.println(“this:+this”)代码>
但是我们永远不能做System.out.println(“Super:+Super”)代码>
我想到的原因是,当我们使用new
关键字时,会在堆中分配内存,并且该内存的引用ID会保存在this
中。但堆中没有为父级分配内存空间,因此在super
中没有要存储的引用ID
我错了吗?或者我缺少什么。所以我们可以说这是一个参考变量&super
不是吗?是的,没错。没有可存储在super
中的参考ID,因此我们无法打印它super
只是用于访问父数据成员/构造函数的关键字。因为编译器将此
存储到插槽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局部变量中有一些解释:
在实例方法调用时,局部变量0始终用于传递对正在调用实例方法的对象的引用(在Java编程语言中是这样)Java中的super
关键字不是对象引用,与此不同此
用作调用对象的引用。然而,super是用于解析父类的方法和数据成员的关键字super
指向父类。但是,这个
指向调用对象
class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组成
这就是为什么可以打印对象。但是不能打印super
super本身不是对象。试图进入超级就像试图把哺乳动物从人类身上剥下来…这就是我所说的这是一个引用变量
&`super不是```,但堆中没有为父类分配内存空间”虽然这是真的,因为new
只创建单个对象(或构造函数指向的类),super
的目的不是返回父类的实例(因为没有父类)但只允许类使用父类的成员。例如,如果类重写了某个方法,它仍然可以从父类的“原始”方法调用代码。例如,在swing应用程序中,当我们扩展组件并希望在其上绘制时,我们需要重写paintComponent
方法。但在绘制附加图形之前,我们希望先绘制标准图形(如默认边框、背景),然后在此基础上绘制。所以我们在重写方法的开始调用super.paintComponent(g)
。您可能应该链接“局部变量表”上的更多信息。
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;