Что такое «абстрактный класс» в Java?
java
oop
interface
abstract-class
Равиндра Бабу
источник
источник
Ответы:
Абстрактный класс - это класс, который не может быть создан. Абстрактный класс используется путем создания наследующего подкласса, который может быть создан. Абстрактный класс делает несколько вещей для наследующего подкласса:
Вот пример:
Обратите внимание, что у abstractMethod () нет тела метода. Из-за этого вы не можете сделать следующее:
Там нет метода, который реализует
abstractMethod()
! Так что у JVM нет возможности узнать, что она должна делать, когда получит что-то вродеnew ImplementingClass().abstractMethod()
.Вот правильный
ImplementingClass
.Обратите внимание, что вам не нужно определять
implementedMethod()
илиfinalMethod()
. Они уже были определеныAbstractClass
.Вот еще один правильный
ImplementingClass
.В этом случае вы переопределили
implementedMethod()
.Однако из-за
final
ключевого слова следующее невозможно.Вы не можете сделать это, потому что реализация
finalMethod()
inAbstractClass
помечена как окончательная реализацияfinalMethod()
: никакие другие реализации не будут разрешены, никогда.Теперь вы также можете дважды реализовать абстрактный класс:
Теперь где-то вы могли бы написать другой метод.
Обратите внимание , что даже если мы объявили
b
вAbstractClass
тип, он отображает"Overriden!"
. Это потому, что объект, который мы создалиImplementingClass
, былimplementedMethod()
конечно, переопределен. (Возможно, вы видели, что это называется полиморфизмом.)Если мы хотим получить доступ к члену, специфичному для определенного подкласса, мы должны сначала обратиться к этому подклассу:
Наконец, вы не можете сделать следующее:
Только один класс может быть продлен за один раз. Если вам нужно расширить несколько классов, они должны быть интерфейсами. Ты можешь сделать это:
Вот пример интерфейса:
Это в основном так же, как:
Разница лишь в том, что второй способ не дает компилятору понять, что это на самом деле интерфейс. Это может быть полезно, если вы хотите, чтобы люди реализовывали только ваш интерфейс, а не другие. Однако, как правило, если у вашего абстрактного класса есть только абстрактные методы, вы, вероятно, должны сделать его интерфейсом.
Следующее является незаконным:
Вы не можете реализовать методы в интерфейсе. Это означает, что если вы реализуете два разных интерфейса, разные методы в этих интерфейсах не могут конфликтовать. Поскольку все методы в интерфейсе являются абстрактными, вы должны реализовать метод, и поскольку ваш метод является единственной реализацией в дереве наследования, компилятор знает, что он должен использовать ваш метод.
источник
c.implementedMethod()
печатать "Переопределено!"?SecondImplementingClass
не отменяетimplementedMethod()
.Класс Java становится абстрактным при следующих условиях:
1. По крайней мере один из методов помечен как абстрактный:
В этом случае компилятор заставляет вас пометить весь класс как абстрактный.
2. Класс помечается как абстрактный:
Как уже было сказано: если у вас есть абстрактный метод, компилятор заставляет вас пометить весь класс как абстрактный. Но даже если у вас нет абстрактного метода, вы все равно можете пометить класс как абстрактный.
Общего пользования:
Обычное использование абстрактных классов - предоставить схему класса, похожего на интерфейс. Но, в отличие от интерфейса, он уже может обеспечивать функциональность, то есть некоторые части класса реализованы, а некоторые просто обозначены объявлением метода. ("Аннотация")
Абстрактный класс не может быть создан, но вы можете создать конкретный класс на основе абстрактного класса, который затем может быть создан. Для этого вы должны наследовать от абстрактного класса и переопределять абстрактные методы, то есть реализовывать их.
источник
abstract
ключевое слово - это все, что необходимо для того, чтобы класс был абстрактным. Но конкретный класс не может содержатьabstract
метод . Таким образом, если у вашего класса естьabstract
метод, он должен быть объявлен какabstract
класс компилятору.Класс, который объявлен с использованием абстрактного ключевого слова, известен как
abstract class
. Абстракция - это процесс сокрытия деталей реализации данных и отображения только функциональности для пользователя. Абстракция позволяет вам сосредоточиться на том, что делает объект, а не на том, как он это делает.Основные вещи абстрактного класса
Абстрактный класс может содержать или не содержать абстрактные методы. Это могут быть не абстрактные методы.
Абстрактный метод - это метод, который объявлен без реализации (без фигурных скобок и сопровождается точкой с запятой), например:
пример:
abstract void moveTo(double deltaX, double deltaY);
Если у класса есть хотя бы один абстрактный метод, тогда этот класс должен быть абстрактным
Абстрактные классы не могут быть созданы (вы не можете создавать объекты класса Abstract)
Чтобы использовать абстрактный класс, вы должны наследовать его от другого класса. Предоставить реализации для всех абстрактных методов в нем.
Если вы наследуете абстрактный класс, вы должны предоставить реализации для всех абстрактных методов в нем.
Объявите абстрактный класс Указывая
abstract
ключевое слово перед классом во время объявления, он становится абстрактным. Посмотрите на код ниже:Объявите абстрактный метод Указание
abstract
ключевого слова перед методом во время объявления делает его абстрактным. Посмотрите на код ниже,Почему нам нужно абстрагировать классы
В объектно-ориентированном приложении для рисования вы можете рисовать круги, прямоугольники, линии, кривые Безье и многие другие графические объекты. Все эти объекты имеют определенные состояния (например, положение, ориентация, цвет линии, цвет заливки) и общее поведение (например, перемещение, поворот, изменение размера, рисование). Некоторые из этих состояний и поведения одинаковы для всех графических объектов (например, цвет заливки, положение и перемещение). Другие требуют другой реализации (например, изменить размер или нарисовать). Все графические объекты должны уметь рисовать или изменять размеры сами, они просто отличаются тем, как они это делают.
Это идеальная ситуация для абстрактного суперкласса. Вы можете воспользоваться сходствами и объявить все графические объекты наследуемыми от того же абстрактного родительского объекта (например, :),
GraphicObject
как показано на следующем рисунке.Сначала вы объявляете абстрактный класс
GraphicObject
для предоставления переменных-членов и методов, которые полностью используются всеми подклассами, такими как текущая позиция и метод moveTo.GraphicObject
также объявлены абстрактные методы, такие как рисование или изменение размера, которые должны быть реализованы всеми подклассами, но должны быть реализованы различными способами.GraphicObject
Класс может выглядеть следующим образом :Использование абстрактного метода в суб классов каждого не абстрактные подклассы
GraphicObject
, такие какCircle
иRectangle
, должны обеспечивать реализацию дляdraw
иresize
методов.Внутри
main
метода вы можете вызвать все методы следующим образом:Способы достижения абстракции в Java
Есть два способа добиться абстракции в Java
Абстрактный класс с конструкторами, членами данных, методами и т. Д.
Вывод:
Помните два правила:
Если в классе мало абстрактных методов и мало конкретных методов, объявите его как
abstract
класс.Если класс имеет только абстрактные методы, объявите его как
interface
.Ссылки:
источник
Это класс, который не может быть создан, и вынуждает реализацию классов, возможно, реализовывать абстрактные методы, которые он выделяет.
источник
Проще говоря, вы можете думать об абстрактном классе как об интерфейсе с немного большими возможностями.
Вы не можете создать экземпляр интерфейса, который также имеет место для абстрактного класса.
В вашем интерфейсе вы можете просто определить заголовки методов, и ВСЕ разработчики будут вынуждены реализовать их все . В абстрактном классе вы также можете определить заголовки вашего метода, но здесь - в отличие от интерфейса - вы также можете определить тело (обычно реализация по умолчанию) метода. Более того, когда другие классы расширяют (обратите внимание, не реализуют и, следовательно, вы также можете иметь только один абстрактный класс на дочерний класс) вашего абстрактного класса, они не будут вынуждены реализовывать все ваши методы вашего абстрактного класса, если вы не указали абстрактный метод ( в таком случае это работает как для интерфейсов, вы не можете определить тело метода).
В противном случае для обычных методов абстрактного класса «наследники» могут либо просто использовать поведение по умолчанию, либо переопределить его, как обычно.
Пример:
источник
Из оракульной документации
Абстрактные методы и классы:
Абстрактный метод - это метод, который объявлен без реализации (без фигурных скобок и сопровождается точкой с запятой), например так:
Если класс включает абстрактные методы, то сам класс должен быть объявлен абстрактным, как в:
Когда абстрактный класс является подклассом, подкласс обычно обеспечивает реализации для всех абстрактных методов в своем родительском классе. Однако, если это не так, то подкласс также должен быть объявлен абстрактным .
Поскольку
abstract classes
иinterfaces
связаны, взгляните на ниже вопросы SE:В чем разница между интерфейсом и абстрактным классом?
Как мне объяснить разницу между интерфейсом и абстрактным классом?
источник
Получите ваши ответы здесь:
Абстрактный класс против интерфейса в Java
Может ли абстрактный класс иметь конечный метод?
Кстати, это вопрос, который вы задали недавно. Подумайте о новом вопросе для создания репутации ...
Редактировать:
Только что понял, что постеры этого и упомянутых вопросов имеют одинаковое или хотя бы похожее имя, но идентификатор пользователя всегда различен. Так что либо есть техническая проблема, у кейера возникают проблемы с повторным входом в систему и поиском ответов на его вопросы, либо это своего рода игра для развлечения сообщества SO;)
источник
Маленькое дополнение ко всем этим постам.
источник
Абстрактный класс не может быть непосредственно создан, но должен быть получен из, чтобы его можно было использовать. Класс ДОЛЖЕН быть абстрактным, если он содержит абстрактные методы: либо напрямую
или косвенно
Однако класс может быть абстрактным, не содержащим абстрактных методов. Это способ предотвратить прямую инстанцию, например,
Последний стиль абстрактных классов может использоваться для создания «интерфейсоподобных» классов. В отличие от интерфейсов, абстрактный класс может содержать неабстрактные методы и переменные экземпляра. Вы можете использовать это для предоставления некоторых базовых функций расширению классов.
Другой частый шаблон заключается в реализации основных функций в абстрактном классе и определении части алгоритма в абстрактном методе, который будет реализован расширяемым классом. Глупый пример:
источник
Решение - базовый класс (аннотация)
источник
Абстрактный класс - это класс, который объявлен абстрактным - он может включать или не включать абстрактные методы. Абстрактные классы не могут быть созданы, но они могут быть разделены на подклассы.
Другими словами, класс, который объявлен с абстрактным ключевым словом, известен как абстрактный класс в Java. Он может иметь абстрактный (метод без тела) и неабстрактный методы (метод с телом).
Важное примечание: - Абстрактные классы нельзя использовать для создания экземпляров объектов, их можно использовать для создания ссылок на объекты, поскольку подход Java к полиморфизму во время выполнения реализован с использованием ссылок на суперклассы. Таким образом, должна быть возможность создать ссылку на абстрактный класс, чтобы его можно было использовать для указания на объект подкласса. Вы увидите эту функцию в следующем примере
источник
Абстрактный класс - это класс, который не полностью реализован, но предоставляет что-то вроде схемы для подклассов. Он может быть частично реализован тем, что содержит полностью определенные конкретные методы, но он также может содержать абстрактные методы. Это методы с сигнатурой, но без тела метода. Любой подкласс должен определять тело для каждого абстрактного метода, в противном случае он также должен быть объявлен абстрактным. Поскольку абстрактные классы не могут быть созданы, они должны быть расширены как минимум на один подкласс, чтобы их можно было использовать. Думайте об абстрактном классе как об общем классе, и подклассы должны заполнить недостающую информацию.
источник
Класс, который может иметь как конкретные, так и не конкретные методы, т.е. с телом и без.
источник
Он ничего не делает, просто предоставляет общий шаблон, который будет использоваться для его подкласса
источник