我说的是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 是一个非静态变量,不能从静态上下文访问非静态实体。