13

我说的是java语言。

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

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

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

4

5 回答 5

13

不,super确实指的是一个实例——this指的是同一个实例——当前对象。它只是一种引用超类中定义的方法和字段的方法,这些方法和字段在当前类中被覆盖或隐藏。

于 2013-01-01T18:00:27.047 回答
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 的超类的实例。

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


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

于 2013-01-01T18:00:53.620 回答
10

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

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

class Sub extends Base {
    static void func() {
        Base.func();
        . . .
    }
}
于 2013-01-01T18:00:35.070 回答
0

Super 是一个非静态变量,不能从静态上下文访问非静态实体。

于 2018-06-23T06:14:45.503 回答
0

在此处输入图像描述

 super & this are build in non-static reference keywords
 these must be accessed with the non-static methods of the childClass
于 2021-07-22T19:59:37.017 回答