[英]Why can I not use “super” variable from a static context, even though “super” refers to the parent class and NOT a class instance, unlike “this”?
我说的是java语言。
变量“this”在类中使用时,指的是该类的当前实例,这意味着您不能在静态方法中使用“this”。
但是“super”在类中使用时是指该类的超类,而不是超类的实例,这意味着您可以在静态方法中使用“super”。 但事实证明你不能。
一个可能的解释是说“超级”也指的是超类的一个实例,但我不明白为什么它应该......
不, super
确实引用了一个实例——与this
引用的实例相同——当前对象。 这只是一种引用超类中定义的方法和字段的方法,这些方法和字段在当前类中被覆盖或隐藏。
这是 JLS 中关于super
关键字的部分:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11.2
形式
super.Identifier
指的是当前对象名为 Identifier 的字段,但将当前对象视为当前类的超类的实例。形式
T.super.Identifier
指的是与 T 对应的词法封闭实例的名为 Identifier 的字段,但该实例被视为 T 的超类的实例。
在这两种情况下,很明显都需要一个实例对象。
此外,静态上下文与实例上下文有些不同,因为类不能覆盖静态方法,只能隐藏它们。
不能在静态上下文中使用super
的原因与不能在静态上下文中使用this
原因相同。 在这两种情况下,这个词都是指一个实例。
在静态上下文中,您始终可以显式使用超类的名称:
class Sub extends Base {
static void func() {
Base.func();
. . .
}
}
Super 是一个非静态变量,不能从静态上下文访问非静态实体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.