Вызов нестатических нереализованных методов с использованием ссылки на интерфейс

Я следую руководству здесь https://www.concretepage.com/spring-boot/spring-boot-security-rest-jpa-hibernate-mysql-crud-example, чтобы создать базовый проект Spring Boot CRUD, я пытаюсь понять, что происходит с конкретным фрагментом кода.

Мое понимание интерфейсов в java заключается в том, что вы не можете вызвать сигнатуру метода интерфейса, который не является статическим и нереализованным. Но здесь в СтатьяService.java создается ссылка на интерфейс IArticleDAO, затем он использует этот тип ссылки для вызова методов из этого интерфейса IArticleDAO.java

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

Если у вас есть экземпляр интерфейса, вы можете вызывать все методы, объявленные в интерфейсе. Вот для чего нужны интерфейсы. Какие бы классы ни реализовывали интерфейс, они обеспечивают реализацию объявленных методов.

khelwood 19.03.2019 16:53

Другими словами, если у вас есть переменная типа IArticleDAO, и она не равна нулю, она всегда ссылается на экземпляр класс, реализующий IArticleDAO. В этом классе реализует все необходимые методы.

RealSkeptic 19.03.2019 16:59

Спасибо, ребята, я думаю, моя проблема заключалась в том, что я не мог видеть, где создается экземпляр, я думаю, мне нужно немного изучить, как работает @autowired

MOG 19.03.2019 17:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Итак, если class A implements B, вы можете назначить экземпляр A переменной B: B b = new A()

Дополнительная абстракция в этом случае заключается в том, что используемое поле — это @AutoWired. Это означает, что Spring Framework найдет экземпляр объекта, который реализует интерфейс, и установит поле.

Я просто не понял, что Spring на самом деле ищет конкретный класс для применения к этой ссылке, но теперь это имеет смысл

MOG 19.03.2019 18:54

Другие вопросы по теме