С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
1

Классы и интерфейсы

19.09.2024, 23:24. Показов 512. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
easybudda, какой бы ты озвучил критерий когда наследоваться от класса, а когда от интерфейса?

Я правда пока только одну свежую книжку про Java прочитал... Но для себя ответа на такой вопрос не нашел.
Читал книжки и до этого, из интереса, но тогда интерфейсов еще не было.

 Комментарий модератора 
Тема выделена из Вернуть объект из списка списков
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2024, 23:24
Ответы с готовыми решениями:

Интерфейсы, классы.
1.Создать интерфейс Animal (животное), содержащий методы: расчет количества корма (принимаемые...

Интерфейсы и абстрактные классы
1. Разработать иерархию классов и интерфейсов заданной предметной об-ласти; 2. Для каждого...

Интерфейсы и абстрактные классы
В классе надо разработать иерархию классов и интерфейсов, а именно: Разработать иерархию и...

Интерфейсы и абстрактные классы
Здравствуйте , помогите пожалуйста никак не могу написать код:cry: к заданию: Реализовать...

22
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
20.09.2024, 01:09 2
Цитата Сообщение от krvsa Посмотреть сообщение
какой бы ты озвучил критерий когда наследоваться от класса, а когда от интерфейса?
Ну я бы не отождествлял классы и интерфейсы. От интерфейсов не наследуются, их реализуют. Правда, появление в интерфейсах методов по умолчанию несколько смазало это утверждение, но в любом случае... Не сочтите за какое-то железо-бетонное правило, но раз уж у меня спросили, для реализации логики программы пишутся интерфейсы. А для реализации методов интерфейсов пишутся классы (а то и вовсе лямбда функции в простых случаях). При этом не принципиально, самостоятельный это класс (технически - наследник от object), или у него предков, как у дурака фантиков. Ну а с наследованием классов логика всегда одна - от общего к частному...
2
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
20.09.2024, 19:24  [ТС] 3
Цитата Сообщение от easybudda Посмотреть сообщение
От интерфейсов не наследуются, их реализуют.
Я пока ошибаюсь в применении некоторых терминов Java...

Цитата Сообщение от easybudda Посмотреть сообщение
но раз уж у меня спросили, для реализации логики программы пишутся интерфейсы. А для реализации методов интерфейсов пишутся классы
Ок.
Хотя я это не совсем воспринимаю...

Как-то попалась вот такая статейка https://habr.com/ru/companies/... es/707762/
И мне больше понравились такие "правила". Х/з насколько я правильно понял тему класс или интерфейс.
- Если не нужно изменяемое состояние можно использовать интерфейс
- Если нужно изменяемое состояние нужно использовать абстрактный класс

Так же класс может реализовывать множество интерфейсов, но наследоваться может только от одного класса.
Это так же не мало важный фактор на мой взгляд...
0
1053 / 647 / 96
Регистрация: 10.03.2012
Сообщений: 4,337
20.09.2024, 19:28 4
Цитата Сообщение от krvsa Посмотреть сообщение
Я правда пока только одну свежую книжку про Java прочитал...
Подскажите, какую книгу читали?
0
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
20.09.2024, 19:43  [ТС] 5
easybudda, исходя из моих умозаключений...
Я и смотрю на твой пример.

- Для чего там единственный интерфейс?
- Все равно делается абстрактный класс, т.к. нужно таки изменяемое состояние.
- Выигрыша по количеству символов нет. Т.е. можно запросто обойтись одним абстрактным классом, добавив ему еще абстрактный метод voice(), т.к. метод getName() у него уже есть.

Так же мне не понятно почему класс не реализовал метод voice(), согласно интерфейсу?
Или абстрактные классы не обязаны выполнять требования интерфейса?
Я думал такое обязательно...

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

Добавлено через 8 минут
Цитата Сообщение от Whitecolor Посмотреть сообщение
какую книгу читали?
Какие читал до этого не особо помню... Т.к. между чтениями проходили годы.
Последняя книжка это Java. Полное руководство. 12-е изд
Но там нет даже описания работы со списками...
Т.е. рассказывается про сами основы синтаксиса ЯП. Ну и примеры естественно рассматриваются.

Поскольку считаю что четкое понимание "где интерфейс, а где класс" довольно принципиальный вопрос сейчас, а далее он будет еще принципиальнее.
Стараюсь побеседовать про это при любом удобном случае. Поскольку работаю на другом ЯП и не всегда бывает время на Java...

А тут такой удобный случай!
Грех не воспользоваться.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
20.09.2024, 20:24 6
Цитата Сообщение от krvsa Посмотреть сообщение
- Если не нужно изменяемое состояние можно использовать интерфейс
- Если нужно изменяемое состояние нужно использовать абстрактный класс
А что мешает включать в интерфейс методы, которые должны бы менять внутреннее состояние объектов классов, их реализующих?
Цитата Сообщение от krvsa Посмотреть сообщение
Так же класс может реализовывать множество интерфейсов, но наследоваться может только от одного класса.
Есть такое. Я, правда, не понял, какие у Вас в связи с этим сложности?
Цитата Сообщение от krvsa Посмотреть сообщение
- Для чего там единственный интерфейс?
- Все равно делается абстрактный класс, т.к. нужно таки изменяемое состояние.
Беда простеньких примеров в том, что они порой больше вопросов, чем ответов порождают. В общем случае питомец - это не обязательно животное. Кому и кактус с фикусом питомцы, а кому и тамагочи какой-нибудь. И опять же - кактус с фикусом могут быть потомками общего класса Vegitable, а тамагочи может быть вполне себе отдельным классом (не очень знаком с темой, возможно, и там какие-то варианты есть). И, раз уж мы создаём список питомцев, можем смело пихать в него всё, что реализует интерфейс Pet, не зависимо от того, к какому виду (или подвиду) оно принадлежит.
Цитата Сообщение от krvsa Посмотреть сообщение
Или абстрактные классы не обязаны выполнять требования интерфейса?
Не, не обязаны. Но в подклассе, из которого предполагается создавать объекты, эти методы должны быть хоть как-то реализованы.
0
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
20.09.2024, 20:41  [ТС] 7
Цитата Сообщение от easybudda Посмотреть сообщение
И, раз уж мы создаём список питомцев, можем смело пихать в него всё, что реализует интерфейс Pet, не зависимо от того, к какому виду (или подвиду) оно принадлежит.
Вот эту "возможность" интерфейса я так же понял.
Что "через реализацию" интерфейса можно наладить взаимодействие с абсолютно разными по своей сути классами. Тут только интерфейс. Т.к. класс таки подразумевает родство по своей природе.

Цитата Сообщение от easybudda Посмотреть сообщение
Не, не обязаны. Но в подклассе, из которого предполагается создавать объекты, эти методы должны быть хоть как-то реализованы.
Т.е. в создаваемом объекте (или экземпляре) должны быть. Правильно я выразился?

Цитата Сообщение от easybudda Посмотреть сообщение
Беда простеньких примеров в том, что они порой больше вопросов, чем ответов порождают.
Все так. Но я начинающий в Java - т.ч. вопросы сейчас для меня весьма полезны, т.к. ответы на них могут многое прояснить.
Т.ч. спасибо за участие и ответы.

Цитата Сообщение от easybudda Посмотреть сообщение
А что мешает включать в интерфейс методы, которые должны бы менять внутреннее состояние объектов классов, их реализующих?
В этом нет никаких сомнений.
Напомню что краеугольным камнем для меня только вопрос "класс или интерфейс, что использовать"?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
20.09.2024, 21:55 8
Цитата Сообщение от krvsa Посмотреть сообщение
Т.е. в создаваемом объекте (или экземпляре) должны быть. Правильно я выразился?
В классе, объект которого создаётся, должны быть определены все методы. При чём сам класс может быть и анонимным. В примере выше такое тоже работает:
Java
1
2
        Pet chupakabra = new Animal("Chupacabra") { public String voice(){return "G-RRR-HHHHH!";} };
        System.out.println(chupakabra.getName() + ": " + chupakabra.voice());
0
1053 / 647 / 96
Регистрация: 10.03.2012
Сообщений: 4,337
21.09.2024, 13:24 9
Цитата Сообщение от krvsa Посмотреть сообщение
Java. Полное руководство. 12-е изд
Какой автор?
0
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
21.09.2024, 20:36  [ТС] 10
Цитата Сообщение от Whitecolor Посмотреть сообщение
Какой автор?
Разумеется Герберт Шилдт.
Это будет видно в первой же ссылке, если загуглить строчку "Java. Полное руководство. 12-е изд".
0
Эксперт PythonЭксперт Java
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
23.09.2024, 11:53 11
Цитата Сообщение от krvsa Посмотреть сообщение
Что "через реализацию" интерфейса можно наладить взаимодействие с абсолютно разными по своей сути классами.
Тадам. Интерфейс, может вообще не декларировать методов. Пустой, ага.
Пруфы можно найти в java core например ))
0
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
23.09.2024, 12:29  [ТС] 12
iSmokeJC, я вообще ничего не понял из написанного тобой...

Добавлено через 1 минуту
Цитата Сообщение от iSmokeJC Посмотреть сообщение
может вообще не декларировать методов. Пустой, ага.
Для чего вообще использовать пустой интерфейс?
0
Эксперт PythonЭксперт Java
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
23.09.2024, 12:36 13
Интерфейс без методов. Пустой. Что тут непонятного?

Добавлено через 5 минут
Цитата Сообщение от krvsa
Для чего вообще использовать пустой интерфейс?
Ответ есть в твоих же словах в этом топике
0
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
23.09.2024, 14:19  [ТС] 14
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Ответ есть в твоих же словах в этом топике
Кроме методов там еще константы можно заводить...
Только какой профит в этом? Разве что вместо наследования от одного класса перейти к списку интерфейсов...

iSmokeJC, капец ты какой-то загадочный.

Добавлено через 1 минуту
iSmokeJC, какое бы ты правило мог бы привести на предмет "когда применить интерфейс, а когда класс"?
0
Эксперт PythonЭксперт Java
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
23.09.2024, 14:26 15
Ну, ежели класс должен "подходить под несколько критериев", а-ля множественное наследование, то абстрактный класс уже не подходит никак. А интерфейсов хоть десяток реализуй.
1
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
23.09.2024, 14:46  [ТС] 16
iSmokeJC, правильно ли я понял? Как тебе такое правило?
- Всегда делай интерфейс.
- Если что-то не получается сделать через интерфейс, делай класс.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
23.09.2024, 18:52 17
krvsa, влезу с вашего позволения...
Цитата Сообщение от krvsa Посмотреть сообщение
- Всегда делай интерфейс.
Кроме каких-то совсем тривиальных случаев, не имеющих и шанса на развитие, да, так лучше.
Цитата Сообщение от krvsa Посмотреть сообщение
- Если что-то не получается сделать через интерфейс, делай класс.
И снова: интерфейсы и классы это не какие-то тождественные и взаимозаменяемые вещи. Интерфейс можно представить, как некий контракт. Потребитель для реализации своих хотелок выбирает контракт, по которому поставщик обязуется эти хотелки выполнять, и поставщика, под этим контрактом подписавшегося.
Цитата Сообщение от krvsa Посмотреть сообщение
Для чего вообще использовать пустой интерфейс?
Про паттерн "Маркер" почитайте.
Цитата Сообщение от krvsa Посмотреть сообщение
Кроме методов там еще константы можно заводить...
Только какой профит в этом? Разве что вместо наследования от одного класса перейти к списку интерфейсов...
Ну вот представьте: константа Пи используется в геометрии, электрофизике, статистике (и бог знает, где ещё)... При условии, что Вы живёте в мире, где в java нет класса Math, и пишите программу, охватывающую все эти три области сразу, самый простой и очевидный способ "расшарить" эту константу между модулями, в которых она используется - включить её в интерфейс, который "реализуется" везде, где нужна константа Пи, пусть даже кроме неё модули между собой вообще ни что больше не связывает...
1
Эксперт JSЭксперт HTML/CSS
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
23.09.2024, 19:32  [ТС] 18
Цитата Сообщение от easybudda Посмотреть сообщение
интерфейсы и классы это не какие-то тождественные и взаимозаменяемые вещи
Про это и в книжках написали... И табличку различий предоставили...
Т.ч. это все тривиальные вещи.

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

Цитата Сообщение от easybudda Посмотреть сообщение
Про паттерн "Маркер" почитайте.
Почитал...
Что-то дюже глубоко заныривают с этим "маркером"!
Х/з понадобится ли такое мне или нет...

Добавлено через 7 минут
Цитата Сообщение от easybudda Посмотреть сообщение
самый простой и очевидный способ "расшарить" эту константу между модулями, в которых она используется - включить её в интерфейс, который "реализуется" везде, где нужна константа Пи, пусть даже кроме неё модули между собой вообще ни что больше не связывает...
Во! Модули вход пошли.
Тут я пока не особо владею знаниями.
Интерфейсы можно использовать "между" модулями, а классы уже не получится?

Там же вроде как можно делать подключения, как интерфейсов, так и модулей...
Т.е. все опять сведется к одиночному наследованию классов против перечня реализованных интерфейсов?

Добавлено через 13 минут
Цитата Сообщение от krvsa Посмотреть сообщение
как интерфейсов, так и модулей...
Не тот термин написал.
Читать как как интерфейсов, так и классов...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
23.09.2024, 19:49 19
Цитата Сообщение от krvsa Посмотреть сообщение
Во! Модули вход пошли.
Ну это не столько к терминологии отдельно взятого ЯП, сколько к общим принципам относится. Вычисления, относящиеся к разным областям, лучше в разные модули разносить (не зависимо от того, есть ли в языке слово "module", "package", или там подобное разделение как-то по своему устроено).
Цитата Сообщение от krvsa Посмотреть сообщение
Интерфейсы можно использовать "между" модулями, а классы уже не получится?
Да и классы получится, если не лень каждый раз перед константой имя класса писать... Возможность держать константы в интерфейсах - это не главное их предназначение.
0
768 / 491 / 66
Регистрация: 22.12.2013
Сообщений: 2,421
Записей в блоге: 19
23.09.2024, 20:16 20
Цитата Сообщение от krvsa Посмотреть сообщение
какой бы ты озвучил критерий когда наследоваться от класса, а когда от интерфейса?
Вы имеете в виду наследование и реализацию абстрактного класса?
Интерфейс описывает поведение. У него нет состояния. У абстрактного класса есть состояние : он описывает поведение и состояние.

Абстрактный класс — это «заготовка» класса: реализовано большинство методов (включая внутренние), кроме нескольких.

Из определений, терминологии все становится понятно.
Вы упомянули наследование и реализацию.

Интерфейс - это своего рода "контракт" в котором прописано, что разработчик обязуется реализовать все методы интерфейса в классе который этот интерфейс реализовывает.

public interface Shape extends Cloneable{} - пример интерфейса, который наследует другой интерфейс.

Интерфейсы для реализации множественного наследования и расширения функциональности класса.

Класс, реализующий интерфейс, должен обеспечить реализацию всех его метода, если только это не абстрактный класс.
0
23.09.2024, 20:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2024, 20:16
Помогаю со студенческими работами здесь

Классы и интерфейсы в Java
Создать класс, который реализовывает следующий интерфейс: interface A{ // Метод печатает Ваше...

Абстрактные классы. Интерфейсы
1.Создать абстрактный класс Edition с функциями, позволяющими вывести на экран информацию об...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для классов
Здравствуйте, у меня затруднение с выполнением данного задания. Необходимо реализовать...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих...

Классы и интерфейсы
Задание выглядит след образом - Создайте библиотеку классов, состоящую из геометрических фигур -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru