java中的System.out.println(super)

时间:2017-08-20 09:36:03

标签: java this super

java中的

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不是吗?

3 个答案:

答案 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只是一个用于访问父数据成员/构造函数的关键字。