Абстрактный класс в Java

abstract class java

В продолжения статьи об классах и методах в  java сегодня затронем тему абстрактного класса:

  • что такое абстрактный класс в java;
  • как его создать;
  • как пользоваться абстрактным классом;
  • и самое главное — зачем нужен данный вид классов.

Абстрактный класс — это класс, в объявлении которого есть ключевое слово abstract. Его отличие от обычного класса в том, что нельзя создать объект или экземпляр данного класса. Все остальное в абстрактном классе остается таким как и в обычном. У него есть методы. Только абстрактный класс может иметь абстрактные методы — у которых нет реализации, только объявление. Это означает, что абстрактный метод должен быть реализован в классе-наследнике. Для того чтобы полностью понимать картину абстрактный классов и методов нужно владеть таким понятием как ООП. Ведь абстрактные классы чаще всего используются при реализации наследования.

Теперь когда мы немного познакомились с теорией, предлагаю перейти к практике:

Код   
public abstract class AbstractClassExample {
}

Выше реализован пример абстрактного класса. Как уже говорилось: чтобы класс стал абстрактным нужно добавить к его объявлению ключевое слово abstract.

Абстрактный класс может содержать как обычные, так и абстрактные методы. Давайте реализуем и те, и другие.

Код   
public abstract class AbstractClassExample {

    public abstract void abstractMethodExample();

    public void classicMethodExample(){
        System.out.println("Classic method realisation");
    }
}

Класс, который унаследуется от примера выше должен обязательно реализовать абстрактный метод abstractMethodExample. Реализовывать обычный метод в классе-наследнике не обязательно. В случае, если наследник не реализует обычный метод абстрактного метода — выполняется реализация родителя.

Код   
package com.javamaster.javamastertests.config;

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();
    }
}

Результатом выполнения кода будет:

результат выполнения абстрактного класса

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

Код   
package com.javamaster.javamastertests.config;

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();
    }
}

В примере выше сработает реализация переопределенного метода в наследнике.

В самом начале мы говорили, что создать экземпляр абстрактного класса нельзя. Это верно. Но, можно создать переменную этого класса. Внимательно посмотрите на пример ниже.

Код   
package com.javamaster.javamastertests.config;

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. С большим познанием основ ооп и принципов построения систем, Вы сможете умело управлять различными видами классов. И, однажды, абстрактный класс сможет выручить в сложных ситуациях программирования и проектирования систем.

Понравилась статья? Поделиться с друзьями:
Комментарии: 3
  1. Juris

    Доброго времени суток!
    Тема весьма сложная для начинающего, потому возник вопрос, для чего все-таки нужны абстрактные классы, наследование — это понятно, но зачем тут нужны абстрактные классы, покажите на примере, где это является необходимостью

    1. Denys (автор)

      Здравствуйте. На первый взгляд: абстрактный класс можно заменить на интерфейс и это действительно так. НО! В абстрактном классе могут быть уже реализованные методы. Тогда как в интерфейсе идет только объявление методов. Сейчас, когда уже есть java11 в интерфейсе может быть один реализованный метод. В абстрактном классе же можно объявить и реализовать сколько угодно методов. Подкреплю теорию примером. Допустим у вас есть класс Animal в котором объявлены методы voice(), walk(), name(). Допустим первые 2 метода вы решили сделать абстрактными, а последний реализовать. Когда класс будет наследовать Animal он должен будет обязательно реализовать методы voice(), walk() так как они абстрактные, но метод name() ему реализовывать не обязательно. Допустим в данном методе будет выводиться строка «Я животное». Ваш товарищ по команде будет наследовать ваш абстрактный класс Animal и ему обязательно подсветит, что нужно реализовать методы voice(), walk(), а метод name() он будет реализовывать уже по усмотрению. Он может как переопределить такой метод, так и оставить реализацию родителя.
      Разумеется, пример очень банальный, но на реальных и сложных проектах абстрактный класс часто приходит на выручку:)

  2. александр

    AbstractClassRealization — такие имена в примерах усложняют чтение кода, и понимание его соответственно.

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: