为什么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规范文档,但我没有找到原因.
查看http://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html上的语法
该super关键字必须始终跟SuperSuffix,它不能为空.
所以super永远不能孤立地作为一种表达.
实现一个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在概念上破坏了面向对象编程。