Java 为什么我不能用“我可以用”呢;超级";来自静态上下文的变量,即使;超级";引用父类,而不是类实例,不同于;这是什么;?
我说的是java语言 在类中使用变量“this”时,引用该类的当前实例,这意味着您不能在静态方法中使用“this” 但是,当在类中使用“super”时,它指的是该类的超类,而不是超类的实例,这意味着您可以在静态方法中使用“super”。但事实证明你不能Java 为什么我不能用“我可以用”呢;超级";来自静态上下文的变量,即使;超级";引用父类,而不是类实例,不同于;这是什么;?,java,static,this,super,Java,Static,This,Super,我说的是java语言 在类中使用变量“this”时,引用该类的当前实例,这意味着您不能在静态方法中使用“this” 但是,当在类中使用“super”时,它指的是该类的超类,而不是超类的实例,这意味着您可以在静态方法中使用“super”。但事实证明你不能 一种可能的解释是,“super”也指超类的一个实例,但我不明白为什么它应该…不,super指的是一个实例-this指的是同一个实例-,即当前对象。这只是引用超类中定义的方法和字段的一种方式,这些方法和字段在当前类中被重写或隐藏。您不能从静态上下文
一种可能的解释是,“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引用实例并不妨碍其访问超类静态变量的能力(出于同样的原因,实例方法可以访问超类的静态变量-实例变量不能从静态上下文引用,但静态变量可以从非静态上下文引用).它不是一个真正的变量,而是一个参考