![](/img/trans.png)
[英]Valid For Loop - but why? for(;;System.out.println(“a”));
[英]Why is System.out.println(super) not permitted?
为什么System.out.println(super)
不允许?
System.out.println(this);
这没关系,并且this.toString()
被自动调用和打印。 当然,实例变量可以代替this
。
但是, this
和super
可以以我所知道的相同方式使用。
System.out.println(super);
那么为什么会失败呢? 我认为它应该隐式调用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());
}
}
现在,让我们接受您的建议,并假设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();
}
}
现在,如果我理解你,你建议主要的 function 应该按顺序打印:
Derived
的toString()
的实现:“Derived”。Derived
中Description()
的实现:“派生描述”Base
的toString()
的实现:“Base”。Base
的Description()
的实现:它不存在。 我能想到的两种解决方案会导致更大的问题:
Derived
返回实现:破坏一致性。 简而言之, super
这个词的这种使用在概念上破坏了面向对象的编程。
this
是指您当前的object 。 super
是指超级class , class 您当前的 object 直接继承自(或者它可以是超级的构造函数)。 所以
System.out.println(this)
打印对象的 toString() 方法,但是
System.out.println(super)
失败,因为 super 不是 object (因此没有 toString() 方法)。
Super 仅与调用 static 方法有关。 如果您使用实际上引用您的 object 本身的 super 调用非静态方法,即this
。 例如,您可以说System.out.println(super.toString())
。 这将起作用并将运行实际 class 的toString()
。
我认为这就是禁止将super
作为参数传递给其他方法的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.