В продолжения статьи об классах и методах в java сегодня затронем тему абстрактного класса:
- что такое абстрактный класс в java;
- как его создать;
- как пользоваться абстрактным классом;
- и самое главное – зачем нужен данный вид классов.
Абстрактный класс – это класс, в объявлении которого есть ключевое слово abstract. Его отличие от обычного класса в том, что нельзя создать объект или экземпляр данного класса. Все остальное в абстрактном классе остается таким как и в обычном. У него есть методы. Только абстрактный класс может иметь абстрактные методы – у которых нет реализации, только объявление. Это означает, что абстрактный метод должен быть реализован в классе-наследнике. Для того чтобы полностью понимать картину абстрактный классов и методов нужно владеть таким понятием как ООП. Ведь абстрактные классы чаще всего используются при реализации наследования.
Теперь когда мы немного познакомились с теорией, предлагаю перейти к практике:
}
Выше реализован пример абстрактного класса. Как уже говорилось: чтобы класс стал абстрактным нужно добавить к его объявлению ключевое слово abstract.
Абстрактный класс может содержать как обычные, так и абстрактные методы. Давайте реализуем и те, и другие.
public abstract void abstractMethodExample();
public void classicMethodExample(){
System.out.println("Classic method realisation");
}
}
Класс, который унаследуется от примера выше должен обязательно реализовать абстрактный метод abstractMethodExample. Реализовывать обычный метод в классе-наследнике не обязательно. В случае, если наследник не реализует обычный метод абстрактного метода – выполняется реализация родителя.
public abstract class AbstractClassExample {
public abstract void abstractMethodExample();
public void classicMethodExample(){
System.out.println("Classic method realisation");
}
}
class AbstractClassRealization extends AbstractClassExample{
@Override
public void abstractMethodExample() {
System.out.println("Abstract method realizationg");
}
}
class Main{
public static void main(String[] args) {
AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
abstractClassRealization.abstractMethodExample();
abstractClassRealization.classicMethodExample();
}
}
Результатом выполнения кода будет:
В случае, если в наследнике переопределен обычный метод, будет выполняться его реализация.
public abstract class AbstractClassExample {
public abstract void abstractMethodExample();
public void classicMethodExample(){
System.out.println("Classic method realisation");
}
}
class AbstractClassRealization extends AbstractClassExample{
@Override
public void abstractMethodExample() {
System.out.println("Abstract method realizationg");
}
public void classicMethodExample(){
System.out.println("Classic overriden method");
}
}
class Main{
public static void main(String[] args) {
AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
abstractClassRealization.abstractMethodExample();
abstractClassRealization.classicMethodExample();
}
}
В примере выше сработает реализация переопределенного метода в наследнике.
В самом начале мы говорили, что создать экземпляр абстрактного класса нельзя. Это верно. Но, можно создать переменную этого класса. Внимательно посмотрите на пример ниже.
public abstract class AbstractClassExample {
public abstract void abstractMethodExample();
public void classicMethodExample(){
System.out.println("Classic method realisation");
}
}
class AbstractClassRealization extends AbstractClassExample{
@Override
public void abstractMethodExample() {
System.out.println("Abstract method realizationg");
}
public void classicMethodExample(){
System.out.println("Classic overriden method");
}
}
class Main{
public static void main(String[] args) {
AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
abstractClassRealization.abstractMethodExample();
abstractClassRealization.classicMethodExample();
//мы создали переменную с типом абстрактного класса
AbstractClassExample abstractClassExample = new AbstractClassRealization();
//но сработает всеравно метод класса наследника
abstractClassExample.classicMethodExample();
}
}
Результатом выполнения кода будет:
Данный или похожий пример очень часто можно увидеть в различных тестах. Здесь важно понимать, что будет выполняться метод экземпляра (new AbstractClassRealization()), а не метод типа (AbstractClassExample).
Еще очень часто на собеседованиях можно услышать вопрос: может ли обычный класс иметь абстрактный метод? Ответ: не может. Абстрактный класс может иметь абстрактный и обычный метод, но обычный класс не может иметь абстрактный метод.
Это все, что хотелось рассказать об абстрактных классах в Java. С большим познанием основ ооп и принципов построения систем, Вы сможете умело управлять различными видами классов. И, однажды, абстрактный класс сможет выручить в сложных ситуациях программирования и проектирования систем.
Доброго времени суток!
Тема весьма сложная для начинающего, потому возник вопрос, для чего все-таки нужны абстрактные классы, наследование – это понятно, но зачем тут нужны абстрактные классы, покажите на примере, где это является необходимостью
Здравствуйте. На первый взгляд: абстрактный класс можно заменить на интерфейс и это действительно так. НО! В абстрактном классе могут быть уже реализованные методы. Тогда как в интерфейсе идет только объявление методов. Сейчас, когда уже есть java11 в интерфейсе может быть один реализованный метод. В абстрактном классе же можно объявить и реализовать сколько угодно методов. Подкреплю теорию примером. Допустим у вас есть класс Animal в котором объявлены методы voice(), walk(), name(). Допустим первые 2 метода вы решили сделать абстрактными, а последний реализовать. Когда класс будет наследовать Animal он должен будет обязательно реализовать методы voice(), walk() так как они абстрактные, но метод name() ему реализовывать не обязательно. Допустим в данном методе будет выводиться строка “Я животное”. Ваш товарищ по команде будет наследовать ваш абстрактный класс Animal и ему обязательно подсветит, что нужно реализовать методы voice(), walk(), а метод name() он будет реализовывать уже по усмотрению. Он может как переопределить такой метод, так и оставить реализацию родителя.
Разумеется, пример очень банальный, но на реальных и сложных проектах абстрактный класс часто приходит на выручку:)
AbstractClassRealization – такие имена в примерах усложняют чтение кода, и понимание его соответственно.