Реализация и расширение класса Interface и Abstract соответственно с тем же именем метода в Java - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь понять, как методы по умолчанию справляются с проблемой алмаза в различных сценариях.
И это один из сценариев, который я не могу понять.

Ниже приведено описание
1. Интерфейс с методом по умолчанию method ()
2. Абстрактный класс с методом method ()
3. Конкретный класс, реализующий описанный выше интерфейс и расширяющий абстрактный класс.

interface Interface {
    default void method() {
        System.out.println("Interface method");
    }
}


abstract class AbstractClass {
    void method() {
            System.out.println("Abstract class method");
    }
}


// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {

    @Override
    public void method() {
        super.method();
    }

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition first ends

// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition Second ends

Мои запросы,

1. Почему определение сначала всегда дает вывод как «Метод абстрактного класса» , даже когда я использую тип Interface для конкретного объекта класса?
2. Почему определение second не компилируется?
Если компилятор сначала использует реализацию абстрактного класса в определении, то он должен быть в состоянии определить, что он всегда будет использовать реализацию абстрактного класса во втором определении.

Это поведение меня очень смущает, и любая помощьс благодарностьюВ противном случае, чем больше я углубляюсь в это, тем больше это сбивает с толку.


Редактировать 1:
Ошибка компиляции во втором определении "Унаследованный метод AbstractClass.method () не можетскрыть публичный абстрактный метод в интерфейсе "

1 Ответ

3 голосов
/ 23 сентября 2019

Методы по умолчанию просто так: значения по умолчанию.Если есть реализация, она будет использоваться.Если нет, будет использовано значение по умолчанию.Здесь нет проблем с алмазом (однако может быть с несколькими значениями по умолчанию).

1) Динамическая диспетчеризация

2) Абстрактный класс предоставляет метод с именем method пакетно-приватный доступ;интерфейс требует, чтобы он был общедоступным.

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