Джава-13

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


Java позволяет создавать классы, экземпляры которых создавать нельзя. Такие классы называются абстрактными и обозначаются с помощью ключевого слова abstract. Служат они основой для создания новых классов. Проводя аналогию с готовкой на кухне можно сказать, что абстрактными классами являются соусы, супа, горячие блюда, салаты, гарниры. Так, например, аджика, наршараб, кепчунез являются подклассами соуса. Тогда класс соус может иметь поля: название, состав, соотношение ингредиентов и абстрактный метод «приготовление». Расширяя класс соус, и реализуя метод «приготовление» для конкретного соуса мы получаем реализуемый класс – класс, экземпляр которого можно создать.


Выше обозначено такое понятие как абстрактный метод. Такой метод не имеет реализации, т.е. у него нет кода. Если класс имеет абстрактный метод, то и класс должен быть абстрактным. Абстрактный класс не обязан иметь абстрактные методы. При наследовании абстрактный класс должен быть реализован в наследуемом классе, либо наследуемый класс также должен быть обозначен абстрактным.


В нашем случае (учитывая предыдущие посты) таким классом может стать класс Animal, который будет иметь в иерархии более высокий уровень.

Джава-13 Изучениеджава, Java, Длиннопост

Класс animal имеет конкретное поле name, конструктор, метод getName и абстрактный метод toString. При попытке создать экземпляр класса возникает ошибка. Однако можно создать переменную типа animal, которая будет ссылаться на один из наследуемых и не абстрактных классов.

Джава-13 Изучениеджава, Java, Длиннопост

Как вы видите создан класс Cat, наследуемый (extends) от класса Animal. В нём реализован метод toString, добавлено новое поле murchit, которое достаточно уникально для кошек.


Если мы откажемся от абстрактного класса toString в классе Animal, то не сможем вызвать метод обращением к переменной cat, т.к. в классе Animal такой метод не определён. И нам придется приводить переменную к типу Cat, чтобы иметь возможность использовать метод toString.


В качестве самого простого примера использования абстрактного можно привести элементы управления (кнопка, текстовое поле, надпись, флажок, выпадающий список и т.д.). Все они имеют общие (текст, положение, размер, активность, родитель и т.д.) и уникальные поля (для текстового поля – положение курсора, для флажка – установлен ли значок, для выпадающего списка – выбранный элемент). Используя цикл for each можно, например, получить значение поля «текст» из всех элементов управления на форме.

1
Автор поста оценил этот комментарий

Не дай Боже кому-нибудь попытаться понять твои "уроки".

Автор поста оценил этот комментарий

я пишу на Delphi... знаком и с Java и с C#... могу сказать, что различия между синтаксисом языков с каждым годом все меньше и меньше...

Автор поста оценил этот комментарий
Джаву не знаю. Знаю С++/#.
1. Абстрактный класс не есть класс экземпляр которого нельзя создать, чаще всего ещё как можно ибо тогда накуя нам весь этот полиморфизм.
2. Чаще всего абстрактным называют класс имеющий хотя-бы одну чистую виртуальную функцию или же абстрактную.
3. Абстрактный класс не должен быть реализован в подклассах(не верная формулировка), там реализуют его методы которые были помечены как абстрактные или чисто виртуальные(С++) и требующие явной реализации.
Я советую тебе почитать более качественные статьи и уроки ибо судя по содержанию ты не понял философию этой идеи. И вообще на какой ляд городить класс вместо описания просто класса и абстрактных интерфейсов которых можно наследовать пачками и что в принципе является правильной стратегией отделения представления объектов от операций над их содержимым
Автор поста оценил этот комментарий

Надо было еще написать, что объект типа Animal можно таки создать через анонимный класс, хотя это возможно в следующей главе будет. А так вобще норм.

раскрыть ветку
Автор поста оценил этот комментарий

метод toString() есть у каждого объекта в Java. если его убрать из класса Animal, то ничего не поменяется. более того, в классе Cat его даже можно не переопределять, не смотря на то, что в Animal он объявлен как абстрактный. в этом случае будет использован метод класса java.lang.Object

раскрыть ветку