我有以下java代码,
interface A {
int a = 5;
}
class B {
int a = 6;
}
public class C extends B implements A {
int b = super.a;//Line 10
public static void main(String[] a) {
System.out.println(new C().b);//6
}
}
我期待第10行的编译器错误,因为编译器不知道要引用哪个“a”。但是没有编译器错误。输出是6.有人可以解释B类的实例变量值(6)为什么不接口A的“a”值为5?
super
关键字用于表示父类,在本例中为B
。因此你得到输出为6
。
在a
中定义的interface A
是静态的,在a
中定义的Class B
是一个实例变量。因此,当我们做super.a
时,它指的是在a
中定义的Class B
的实例值
如果你将B
中的变量重命名为aa
,你会得到编译器错误,说a cannot be resolved or is not a field
,因为在a
中定义的interface A
不能直接访问class C
,因为它默认为static
。要访问a
中定义的interface A
,我们需要在类A.a
中明确调用C
如果你在a
中将class B
定义为静态,并删除super
,你将获得compiler error: The field a is ambiguous