主方法尝试访问var,但会导致调用模糊。为什么?无论如何,无法从静态上下文访问Base1中的实例变量var(可见?)。
class Base1 {
int var;
}
interface Base2 {
public static final int var = 0;
}
class Test extends Base1 implements Base2 {
public static void main(String args[]) {
System.out.println("var:" + var);
}
}
答案 0 :(得分:17)
JLS rule for field access ambiguity是
如果标识符在中指定了几个可访问的(§6.6)成员字段 键入
T
,然后字段访问是不明确的和编译时错误 发生。
on the subject of accessibility
引用类型的成员(类,接口,字段或方法),或 类型的构造函数,仅在类型为时才可访问 可访问且声明成员或构造函数允许访问:
它没有区分实例字段访问是否会导致static
上下文中的编译错误。
请注意,您可能已经
public static void main(String args[]) {
Test test = new Test();
System.out.println("var:" + test.var);
}
你仍然有歧义。
答案 1 :(得分:3)
为了使其明确无误,请将接口名称作为限定前缀:
class Test extends Base1 implements Base2 {
public static void main(String args[]) {
System.out.println("var:" + Base2.var);
}
}
答案 2 :(得分:1)
首先,在第一步中,编译器将在您扩展的类和您实现的接口中查找变量var。由于它在第二步中找到了两个地方的变量,因此显示出歧义。
答案 3 :(得分:1)
静态和非静态上下文不规定如何访问变量
访问修饰符实际上是这个... ...
将Base1 中 var的访问修饰符更改为 私有 ,并且歧义消失,但这可能不是您想要的方式塑造,但访问modfiers实际上决定了对实例变量的引用,而不是静态无静态上下文。
class Base1 {
private int var;
//static int var=5;
}
interface Base2 {
public static final int var = 0;
}
class ambiguousNonStaticCall extends Base1 implements Base2 {
public static void main(String args[]) {
System.out.println("var:" + var);
}
}
上面的代码编译得很好。