Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的System.out.println(super)_Java_This_Super - Fatal编程技术网

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;