Полиморфное поведение в Java - PullRequest
       0

Полиморфное поведение в Java

0 голосов
/ 09 сентября 2018

У меня следующий код 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?.

1 Ответ

0 голосов
/ 09 сентября 2018
Ключевое слово

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...