Java中的多态行为

时间:2018-09-09 07:57:54

标签: java polymorphism

我有以下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的实例变量value(6),为什么不对接口A的“ a”值5进行解释。

1 个答案:

答案 0 :(得分:2)

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 Aclass C中,因为默认情况下为static。要访问a中定义的interface A,我们需要在类A.a

中显式调用C

如果您在a中将class B定义为静态,然后删除super,则会得到compiler error: The field a is ambiguous