java中的多态行为

问题描述 投票:1回答:1

我有以下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?

java polymorphism
1个回答
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 A不能直接访问class C,因为它默认为static。要访问a中定义的interface A,我们需要在类A.a中明确调用C

如果你在a中将class B定义为静态,并删除super,你将获得compiler error: The field a is ambiguous

© www.soinside.com 2019 - 2024. All rights reserved.