//父类
public class Super{
public static int A = 111;
public void test(){
System.out.println("super method");
}
}
//子类,继承并实现一个接口
public class Sub extends Super implements Inter2{
public static int A = 222;
}
//接口
interface Inter2{
static int A = 1;
void test();
}
//调用
public static void main(String[] args) {
Sub sub = new Sub();
sub.test();
System.out.println(Sub.A);
}
- Sub中可以不用实现test(),因为继承的Super中有test(),会调用父类的test();
- 如果注释掉Sub中的“public static int A = 222;”,会出现编译错误“The field Sub.A is ambiguous”,意思是Sub.A是模糊的,这是由于Sub本身没有字段A,于是编译器去找父类或实现的接口中是否有匹配的字段A,结果发现父类Super和接口Inter2中都有A,所以无法判断字段A是父类Super中的A还是接口Inter2的A。
如果将Super的字段A和接口Inter2的字段A注释掉,然后Super实现Inter接口,Inter如下:
interface Inter{ static int A = 0; }
main方法中的“System.out.println(Sub.A);”并不会报错,因为编译器在直接父类和实现接口中找不到A后,会继续向直接父类的实现接口或父类继续找,也会向实现接口的父接口找,所以,Sub会找到父类Super实现的接口Inter中的A,编译不出错。
总结:
一个类的字段就是按照这样的顺序查找,先查自己有没有,如果没有,再查父类和接口,依次向上,但是如果两个没有关联,也就是没有连线的类或接口都有所查的字段,那么就会报编译错误“The field Sub.A is ambiguous”。