繁体   English   中英

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

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

在此处输入图片说明

 super & this are build in non-static reference keywords
 these must be accessed with the non-static methods of the childClass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM