为什么不允许System.out.println(super)?

Jay*_*ark 6 java oop tostring

为什么System.out.println(super)不允许?

System.out.println(this);
Run Code Online (Sandbox Code Playgroud)

这没关系,this.toString()可以自动调用和打印.当然,实例变量是OK而不是this.

但是,this并且super可以以我所知的相同方式使用.

System.out.println(super);
Run Code Online (Sandbox Code Playgroud)

那为什么会失败?我认为它应该super.toString()隐含地调用.我已阅读Java规范文档,但我没有找到原因.

Ray*_*oal 8

查看http://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html上的语法

super关键字必须始终跟SuperSuffix,它不能为空.

所以super永远不能孤立地作为一种表达.


Jea*_*nal 4

实现一个super破坏虚拟方法分派的独立变体将是一个非常糟糕的主意。

让我们考虑一下。

abstract class Base {
    abstract String Description();
    String toString() { return "Base"; }
}
class Derived extends Base {
    String Description() { return "Derived description"; }
    String toString() { return "Derived"; }

    static void use(Base instance) {
        System.out.println(instance.toString());
        System.out.println(instance.Description());
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们接受您的建议,并假设该建议super是有效的并且符合您的建议;那么我们可以写Derived

class Derived extends Base {
    // Previous declarations omitted.
    void useSuper() { Derived.use(super); }
    void useThis() { Derived.use(this); }

    static void main() {
        Derived instance = new Derived();
        instance.useThis();
        instance.useSuper();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我理解你的意思,你建议 main 函数应该按顺序打印:

  • toString()from的实现Derived:“派生”。
  • 实施Description()来自Derived:“派生描述”
  • 实施toString()来自Base:“基地”。
  • Description()from的实现Base不存在。我能想到的两种解决方案会导致更大的问题:
    • 引发异常:恭喜,您现在可以破坏任何依赖于实际实现的抽象方法的程序,甚至无需考虑它。(你怎么知道函数会调用抽象方法?)
    • 返回实现Derived:破坏一致性。

简而言之,这个词的这种使用super在概念上破坏了面向对象编程。