The main method tries to access var, but results in ambiguous call. Why? Instance variable var in Base1 isn't accessible (visible?) from static context anyway.
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);
}
}
The JLS rule for field access ambiguity is
If the identifier names several accessible (§6.6) member fields in type
T
, then the field access is ambiguous and a compile-time error occurs.
And on the subject of accessibility
A member (class, interface, field, or method) of a reference type, or a constructor of a class type, is accessible only if the type is accessible and the member or constructor is declared to permit access:
It doesn't make a distinction about whether the instance field access would cause a compile error in a static
context.
Note that you could have had
public static void main(String args[]) {
Test test = new Test();
System.out.println("var:" + test.var);
}
You'd still have the ambiguity.