Разное

Java абстрактные методы: Java. Экспресс-курс: Абстрактные классы и методы

Вопрос №12329 от пользователя Александр Люлис в уроке «Модуль 7. Урок 2. Абстрактные классы.», курс «Введение в Java»

Александр Люлис

Здравствуйте. При прохождении теста, в 4-ом вопросе как мне показалось есть ошибка:

Какие модификаторы доступа могут иметь абстрактные методы?

  • private, protected
  • public, private, protected
  • Никакие
  • public, protected
  • public, private

Так как для внутренней реализации логики в абстрактом классе, использование модификатора private для методов — возможно.

2 0

Сергей Алексеенко

Для обычных методов доступны все модификаторы. Обычные методы могут быть даже static, даже private(в случае с private не представляю зачем это в абстрактном классе).

В случае с абстрактными методами — дела обстоят иначе.

Они не могут быть статичными — поскольку должны быть переопределены и наполнены в потомке. И по той же причине они(абстрактные методы) не могут иметь модификатор доступа

private.

Самый «закрытый» модификатор доступа для абстрактных методов — default (package-private). В наследнике этот метод может иметь более «открытые» модификаторы.

Если же абстрактный метод имеет модификатор public — то в наследнике его «доступность» не может быть понижена даже до protected и др.

0

Александр Люлис

Спасибо. Я перепутал абстрактный метод и класс.

0

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Профессия

Фронтенд-разработчик

Разработка фронтенд-компонентов для веб-приложений

27 октября 10 месяцев

Профессия

Python-разработчик

Разработка веб-приложений на Django

27 октября 10 месяцев

Профессия

Java-разработчик

Разработка приложений на языке Java

27 октября 10 месяцев

Профессия

PHP-разработчик

Разработка веб-приложений на Laravel

27 октября 10 месяцев

Профессия

Node. js-разработчик

Разработка бэкенд-компонентов для веб-приложений

27 октября 10 месяцев

Профессия

Верстальщик

Верстка с использованием последних стандартов CSS

в любое время 5 месяцев

Профессия

Fullstack-разработчик

Разработка фронтенд- и бэкенд-компонентов для веб-приложений

27 октября 16 месяцев

Профессия

Разработчик на Ruby on Rails

Создание веб-приложений со скоростью света

27 октября 5 месяцев

Профессия

Новый

Инженер по тестированию

Ручное тестирование веб-приложений

17 ноября 4 месяца

ооп — Отличия абстрактного класса от интерфейса (abstract class and interface)

Мне кажется достаточно любопытным, что данный вопрос помечен тегом «ооп», но при этом во многих ответах явно просачиваются специфические аспекты конкретных языков программирования. Я же постараюсь дать ответ исходя из понятий ООП и лишь потом показать, почему вообще это различие появилось в некоторых языках программирования.

Абстрактные классы и интерфейсы имеют определенное отношение к наследованию, точнее к моделированию мира. С их помощью мы хотим выразить, что у определенной группы вещей в нашей системе есть что-то общее: некоторое общее поведение, которое отличает эту группу штуковин от всех остальных.

Допустим, для примера, мы хотим смоделировать кнопки в интерфейсе пользователя. Поскольку мы говорим об ООП, то мы выделим некоторый тип Кнопки с некоторым набором операций (которые определяют поведение) и скрытого состояния, на которое опирается поведение (да, скрытого состояния может и не быть). При этом мы можем выделить три вида операции:

  • Конкретная фиксированная операция, которая должна быть абсолютно стабильно для всех типов кнопок.

  • Конкретная операция с поведением по умолчанию (т.е. операция, чье поведение подходит для многих типов кнопок, но могут быть кнопки с другим поведением).

  • Декларация операции без конкретной реализации (т. е. операция, чье поведение определить невозможно, поскольку на этом этапе не известно разумное поведение по умолчанию или же операции могут слишком сильно различаться у разных кнопок).

Другими словами, тип Кнопки может содержать невиртуальные методы (non-virtual methods), виртуальные методы (virtual methods) и абстрактные методы

(abstract methods).

Наличие разных типов методов является очень важным инструментом моделирования и позволяет весьма точно выражать намерения проектировщика. Например, мы можем добавить невиртуальную операцию «Нажатия на кнопку», которая будет делегировать часть своей работы виртуальному (или абстрактному методу) «Обработать нажатие», но при этом всегда выполнять определенную часть работы (прозорливый читатель увидит в этом описании паттерн «Шаблонный метод»).

После того, как мы определили базовый тип, пришло время определить произвольные типы. И тут начинаются вопросы. Точнее, вопросов никаких не возникает, когда у типа есть лишь один непосредственный базовый тип или все базовые типы содержат лишь декларации операций. Не проблема, унаследовать «Кнопку меню» от «Кнопки» и переопределить метод «Нажать на кнопку». Но что, если наш тип «Кнопка меню» будет отнаследован от двух типов с одной и той же виртуальной операцией? Как переопределить лишь одну, а оставить другую? А как быть клиенту нового типа и различить, какую операцию вызвать? А что если у двух базовых типов есть поле с одним именем? А что если у одного базового типа метод «Нажать кнопку» реализован, а у другого – лишь описан в виде декларации?

Нет, все эти проблемы решаемы, и в С++, и Eiffel, и других языках программирования вы можете довольно гибко контролировать, что и как переопределять, что прятать, что выставлять наружу и как вызвать метод определенного базового типа. Но для авторов некоторых языков программирования подобная сложность показалась излишней, и они пошли на хитрость и отделили типы, которые содержат лишь декларации методов в отдельную категорию, и так появились интерфейсы.

Теперь будет легко провести разницу между тремя понятиями – интферфейса, абстрактного базового класса и конкретного базового класса.

  • Интерфейс – описывает некоторое семейство типов и содержит лишь декларации операций (да, я осознанно пишу слово «декларация», а не использую слово «контракт», которое в ООП имеет вполне определенное значение).

  • Абстрактный базовый класс описывает некоторое семейство типов, но помимо декларации операций может содержать реализации по умолчанию (виртуальные методы) и фиксированные операции (невиртуальные методы).

  • Конкретный класс описывает некоторое семейство типов, которое готово для использования клиентами. Такой класс не может содержать декларации операций и все его операции должны быть либо фиксированными (невиртуальные методы) или содержать реализацию по умолчанию (виртуальные методы). Есть еще один подвид конкретных классов – запечатанный (sealed) класс – это разновидность конкретного класса отнаследоваться от которого невозможно, а значит он может содержать лишь конкретные операции.

Выделение интерфейсов в отдельную категорию полезно не только с точки зрения упрощения реализации языков программирования, но и для выделения разных подходов к моделированию. Так, например, наследование классов моделирует отношение «Является» («Кнопка меню» ЯВЛЯЕТСЯ «Кнопкой»), а базовые классы обычно содержат определенный функционал, тесно связанный с функционалом производного класса. Базовые классы не просто моделируют группу типов, но и позволяют использовать повторно существующий функционал.

Интерфейсы же, по своей природе обладают меньшей связностью (low coupling), поскольку не обладают конкретным поведением, которое может осложнить жизнь класса-наследника. Интерфейсы также могут моделировать отношение «Является» («Кнопка меню» ЯВЛЯЕТСЯ «IКнопкой»), но могут определять и менее жесткое отношение «Может выполнять роль» (CAN DO). Например, интерфейс

IEquatable из BCL определяет «дополнительное» поведение, которое говорит о возможности типов сравнивать значения объектов.

Документация JDK 19 — Главная

  1. Главная
  2. Ява
  3. Java SE
  4. 19

Обзор

  • Прочтите меня
  • Примечания к выпуску
  • Что нового
  • Руководство по миграции
  • Загрузить JDK
  • Руководство по установке
  • Формат строки версии

Инструменты

  • Технические характеристики инструментов JDK
  • Руководство пользователя JShell
  • Руководство по JavaDoc
  • Руководство пользователя средства упаковки

Язык и библиотеки

  • Обновления языка
  • Основные библиотеки
  • HTTP-клиент JDK
  • Учебники по Java
  • Модульный JDK
  • Руководство программиста API бортового регистратора
  • Руководство по интернационализации

Технические характеристики

  • Документация API
  • Язык и ВМ
  • Имена стандартных алгоритмов безопасности Java
  • банок
  • Собственный интерфейс Java (JNI)
  • Инструментальный интерфейс JVM (JVM TI)
  • Сериализация
  • Проводной протокол отладки Java (JDWP)
  • Спецификация комментариев к документации для стандартного доклета
  • Прочие характеристики

Безопасность

  • Руководство по безопасному кодированию
  • Руководство по безопасности

Виртуальная машина HotSpot

  • Руководство по виртуальной машине Java
  • Настройка сборки мусора

Управление и устранение неполадок

  • Руководство по устранению неполадок
  • Руководство по мониторингу и управлению
  • Руководство по JMX

Client Technologies

  • Руководство по специальным возможностям Java

Учебник по Java: абстрактный класс и абстрактные методы

Введение в Java + Установка Java JDK и IntelliJ IDEA для Java

Базовая структура программы на Java: знакомство с нашей первой программой Hello World на Java

Учебник по Java: переменные и типы данных в Программирование на Java

Учебник по Java: Литералы в Java

Учебное пособие по Java. Получение пользовательского ввода в Java

Программирование на Java. Упражнение 1: Калькулятор процентного соотношения платы CBSE

Учебное пособие по Java: Глава 1. Практический набор | Практические задачи Java с решением

Учебное пособие по Java. Операторы, типы операторов и выражения в Java

Учебное пособие по Java. Ассоциативность операторов в Java

Учебное пособие по Java. Тип данных выражений и операторы увеличения/уменьшения

Учебное пособие по Java. — Решения + Крики

Учебное пособие по Java. Глава 2. Практический набор (вопросы по практическому использованию Java)

Учебное пособие по Java. Введение в строки

Учебное пособие по Java. Строковые методы в Java

Практические вопросы по Java по работе со строками.

Условные операторы Java: Оператор If-else в Java

Учебное пособие по Java: Реляционные и логические операторы в Java

Учебное пособие по Java: Операторы Switch Case в Java

Учебное пособие по Java: Практические вопросы по условным операторам и Switch Case

Упражнение по программированию на Java 2: игра «камень, ножницы, бумага» на Java

Учебное пособие по Java: циклы While в Java

Учебное пособие по Java: цикл do-while в Java

Учебное пособие по Java: цикл for в Java

Учебное пособие по Java: прервать и продолжить в Java

Учебник по Java: Практические вопросы по циклам

Учебник по Java: Введение в массивы

Учебник по Java: Для каждого цикла в Java

Учебник по Java: Многомерные массивы в Java

Учебник по Java: Практические вопросы по массивам в Java

Как сделать так, чтобы IntelliJ IDEA выглядела потрясающе!

Учебное пособие по Java. Методы в Java

Учебное пособие по Java. Перегрузка методов в Java

Учебное пособие по Java. Переменные аргументы (VarArgs) в Java

Учебное пособие по Java. Рекурсия в Java

Учебное пособие по Java. Учебное пособие: Введение в объектно-ориентированное программирование

Учебное пособие по Java: основные термины в объектно-ориентированном программировании

Учебник по Java. Создание собственного класса Java

Учебник по Java. Основные вопросы по объектно-ориентированному программированию

Учебник по Java. Модификаторы доступа, геттеры и сеттеры в Java

Учебник по Java. Конструкторы в Java

Упражнение по Java 3: Угадай число (OOPs Edition)

Учебник по Java: Упражнение по модификаторам доступа и конструкторам

Наследование в Java

Конструкторы в наследовании в Java

ключевое слово this и super в Java

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

Динамическая отправка методов в Java

Учебник по Java: Упражнение 3 — Решения и сообщения

Учебник по Java: Упражнение 4 — Онлайн-библиотека Вопросы о наследовании

Учебник по Java: абстрактный класс и абстрактные методы

Учебник по Java: Введение в интерфейсы

Учебник по Java: абстрактные классы и интерфейсы

Почему множественное наследование не поддерживается в Java?

Примеры интерфейсов Java и методы по умолчанию

Наследование в интерфейсах

Учебник по Java: полиморфизм в интерфейсах

Практические вопросы по абстрактным классам и интерфейсам по Java

Упражнение по Java 4: Решение и комментарии!

Интерпретируемые и компилируемые языки!

Java интерпретируется или компилируется?

Пакеты в Java

Учебное пособие по Java. Создание пакетов в Java

Модификаторы доступа в Java

Практический набор по пакету Java и модификаторам доступа

Упражнение 5 по Java: создание пользовательского пакета

Многопоточность в Java

Создание потока путем расширения класса потока

Создание потока Java с помощью интерфейса Runnable

Жизненный цикл потока Java

Конструкторы из класса Thread в Java

Приоритеты потока Java

Методы потока Java

Учебник по Java: практические вопросы по потоку

Упражнение 5: Решение и приветствия!

Ошибки и исключения в Java

Синтаксические ошибки, ошибки времени выполнения и логические ошибки в Java (демонстрация)

Исключения и блок Try-Catch в Java

Обработка особых исключений в Java

Вложенный блок Try-Catch в Java

Класс исключения в Java

Throw vs Throws в Java

Наконец блок в Java и зачем он нужен!

Практический набор по ошибкам и исключениям

Java Упражнение 6: Пользовательский калькулятор | Java Practice Question

Java Collections Framework

Иерархия коллекций в Java

Как правильно просматривать документацию по Java

ArrayList в Java: демо и методы

LinkedList в Java: демо и методы

ArrayDeque в Java Хеширование в Java

HashSet в Java

Дата и время в Java

Класс Date в Java

Класс Calendar в Java

Класс GregorianCalendar и TimeZone в Java

API java.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *