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

时间:2011-07-22 05:43:44

标签: java oop tostring

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

System.out.println(this);

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

但是,thissuper可以按我所知的方式使用。

System.out.println(super);

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

4 个答案:

答案 0 :(得分:8)

检查http://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html

处的语法

super关键字必须始终跟随SuperSuffix,后者不能为空。

所以super永远不能单独作为表达。

答案 1 :(得分: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());
    }
}

现在,让我们接受你的建议,并假设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();
    }
}

现在,如果我理解你,你建议主要功能应按顺序打印:

  • toString() Derived的实施:“衍生”。
  • Description() Derived的实施:“衍生说明”
  • toString() Base的实施:“基地”。
  • 来自Description()的{​​{1}}的实施:它不存在。我能想到的两个解决方案会导致更大的问题:
    • 提出异常:恭喜,您现在可以破解任何依赖于实际实现的抽象方法的程序,甚至不用考虑它。 (你怎么知道一个函数会调用抽象方法?)
    • Base返回实施:打破一致性。

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

答案 2 :(得分:0)

this指的是您当前的对象super指的是超级,即当前对象直接继承的类(或者它可以是超级构造函数)。所以

System.out.println(this)

打印对象的toString()方法,但是

System.out.println(super)

失败,因为super不是一个对象(因此没有toString()方法)。

答案 3 :(得分:-5)

Super仅与调用静态方法相关。如果你使用super实际引用你的对象本身的非静态方法,即this。例如,您可以说System.out.println(super.toString())。这将起作用并将运行实际类的toString()

我认为这是禁止将super作为参数传递给其他方法的原因。