为什么不允许System.out.println(super)
?
System.out.println(this);
这没关系,this.toString()
被自动调用和打印。
当然,实例变量是OK而不是this
。
但是,this
和super
可以按我所知的方式使用。
System.out.println(super);
那为什么会失败呢?我认为它应该隐含地调用super.toString()
。
我已阅读Java规范文档,但我没有找到原因。
答案 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
作为参数传递给其他方法的原因。