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

Pra*_*anD 12 java static this super

我说的是java语言.

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

但是"super",当在类中使用时,指的是该类的超类,而不是超类的实例,这应该意味着你可以在静态方法中使用"super".但事实证明你做不到.

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

Sea*_*wen 13

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


Sea*_*oyd 13

以下是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的超类的实例.

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


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


Ted*_*opp 8

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

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

class Sub extends Base {
    static void func() {
        Base.func();
        . . .
    }
}
Run Code Online (Sandbox Code Playgroud)