#java #variables #inheritance #methods #ambi&uity
#java #переменные #наследование #методы #неоднозначность
Вопрос:
У нас есть interface
и class
, не имеющие никакого отношения, каждый из которых имеет методы с одинаковой сигнатурой. Они могут быть связаны с классом, который будет нормально компилироваться.
interface A {
void test();
}
class B {
public void test() {
System.out.println("Test");
}
}
public class MultipleLevelInheritance extends B implements A {
public static void main(Strin&[] ar&s) {
new MultipleLevelInheritance().test();
}
}
Но когда мы делаем то же самое с переменной a, это вызывает неоднозначность.
interface A {
int a = 10;
}
class B {
public static int a = 9;
}
public class MultipleLevelInheritance extends B implements A {
public static void main(Strin&[] ar&s) {
System.out.println(a); //The field a is ambi&uous
}
}
Даже если мы сохраняем a
значение final в B
, это все равно вызывает ошибку. Почему это допустимо для методов и недопустимо для переменных?
Ответ №1:
Когда вы реализуете интерфейс, все переменные наследуются в классе. Итак, когда вы расширяете класс и реализуете интерфейс, у него будет два объявления переменной a. Следовательно, вы получаете ошибку неоднозначности.
Но когда дело доходит до методов, при реализации интерфейса ожидается, что вы обеспечите реализацию методов, определенных в interface. В вашем примере эта реализация предоставляется классом B. Следовательно, ошибки нет.
Ответ №2:
Ваш класс MultipleLevelInheritance реализует интерфейс и расширяет класс, и оба имеют одинаковое имя свойства (a), когда вы вызываете a в MultipleLevelInheritance, Java не может определить, ссылается ли переменная на A.a или B.a. вам просто нужно добавить к ней префикс.
Комментарии:
1. а с методами двусмысленности не будет, есть только одна реализация