Java 为什么我不能用“我可以用”呢;超级";来自静态上下文的变量,即使;超级";引用父类,而不是类实例,不同于;这是什么;?

Java 为什么我不能用“我可以用”呢;超级";来自静态上下文的变量,即使;超级";引用父类,而不是类实例,不同于;这是什么;?,java,static,this,super,Java,Static,This,Super,我说的是java语言 在类中使用变量“this”时,引用该类的当前实例,这意味着您不能在静态方法中使用“this” 但是,当在类中使用“super”时,它指的是该类的超类,而不是超类的实例,这意味着您可以在静态方法中使用“super”。但事实证明你不能 一种可能的解释是,“super”也指超类的一个实例,但我不明白为什么它应该…不,super指的是一个实例-this指的是同一个实例-,即当前对象。这只是引用超类中定义的方法和字段的一种方式,这些方法和字段在当前类中被重写或隐藏。您不能从静态上下文

我说的是java语言

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

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


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

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

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

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

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

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

表单
super.Identifier
指的是名为 当前对象,但当前对象被视为 当前类的超类

格式
T.super.Identifier
指的是名为 对应于T的词汇封闭实例,但具有 实例被视为T超类的实例

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



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

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

您需要接受其他问题的答案。@Sean不知道这一点。我是新来的,我现在就开始。呃,顺便问一下,我到底怎么接受答案?因为你错了“super”指的是一个实例。你确定吗?我认为super指的是当前对象从中扩展的对象-可能是也可能不是实例化的(这就是为什么您可以从超类访问静态变量)super似乎指的是一个实例,因为JLS这么说。但是,为了回答您的其他问题,super引用实例并不妨碍其访问超类静态变量的能力(出于同样的原因,实例方法可以访问超类的静态变量-实例变量不能从静态上下文引用,但静态变量可以从非静态上下文引用).它不是一个真正的变量,而是一个参考