为什么我不能在静态上下文中使用“super”变量,即使“super”指的是父类而不是类实例,不像“this”?

我说的是java语言。

变量“this”在类中使用时,引用该类的当前实例,这意味着您不能在静态方法中使用“this”。

但是,“super”,当在类中使用时,指的是该类的超类,而不是超类的实例,这应该意味着你可以在静态方法中使用“super”。 但事实certificate你不能。

一个可能的解释是说“超级”也指超类的一个实例,但我不明白为什么它应该……

以下是JLS中关于super关键字的部分:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11.2

formssuper.Identifier引用当前对象的名称Identifier的字段,但将当前对象视为当前类的超类的实例。

T.super.Identifierforms是指与T对应的词法封闭实例的名为Identifier的字段,但该实例被视为T的超类的实例。

在这两种情况下,很明显需要一个实例对象。


此外,静态上下文与实例上下文有些不同,因为类不能覆盖静态方法,只能隐藏它们。

不, super确实引用了一个实例 – 它引用的实例 – 当前对象。 它只是一种引用超类中定义的方法和字段的方法,这些方法和字段在当前类中被重写或隐藏。

您不能在静态上下文中使用super ,原因与您在静态上下文中不能使用this原因相同。 在这两种情况下,该词指的是一个实例。

在静态上下文中,您始终可以显式使用超类的名称:

 class Sub extends Base { static void func() { Base.func(); . . . } } 

Super是非静态变量,无法从静态上下文访问非静态实体。