我是Java的新手,据我所知,通常,我们使用super
和this
关键字来引用超类属性。以及我们不能在静态上下文(静态方法)中使用this
和super
关键字。但是我有一个问题。我使用了一个匿名类来使用接口,如下所示。我试图从匿名类内部引用number
变量(位于接口中)。但是即使它不是静态上下文,也无法使用super
关键字引用数字。问题是什么?。我的代码如下。
interface Age{
public static final int number =25;
public abstract int getAge();
}
public class Main {
public static void main(String[] args) {
Age age = new Age(){
public int getAge(){
int number = super.number;//compile error
//why cannot use super keyword in here to refer number variable
return number;
}
};
age.getAge();
}
}
答案 0 :(得分:4)
super
关键字引用父类,而不引用任何接口。在您提供的代码中,Age
是一个接口。无论您正在查看匿名类还是命名类,您都会看到相同的行为。
如果您想知道为什么为什么语言设计者决定不允许super
引用一个接口,则Aggragoth对此进行了评论:一个类可以实现多个接口,因此如果它们每个都实现拥有一个名为number
的成员,编译器将无法确定您尝试使用number
引用哪个接口的super.number
。
答案 1 :(得分:0)
int number = super.number;
在接口中,每个声明的变量都是最终变量,即其值不能更改。此外,关键字super
用于获取父类的public, protected or default variables
,而不是接口。由于这些原因,编译器会在此处引发错误。
正如StriplingWarrior和Aggragoth所说,一个类可以实现多个接口,因此,如果它们每个都有一个名为number
的成员,则编译器将无法确定您要引用的接口号。与super.number
。