abstract class java

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

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

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

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

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

Код    
  1. public abstract class AbstractClassExample {
  2. }

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

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

Код    
  1. public abstract class AbstractClassExample {
  2.  
  3.     public abstract void abstractMethodExample();
  4.  
  5.     public void classicMethodExample(){
  6.         System.out.println("Classic method realisation");
  7.     }
  8. }

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

Код    
  1. package com.javamaster.javamastertests.config;
  2.  
  3. public abstract class AbstractClassExample {
  4.  
  5.     public abstract void abstractMethodExample();
  6.  
  7.     public void classicMethodExample(){
  8.         System.out.println("Classic method realisation");
  9.     }
  10. }
  11.  
  12. class AbstractClassRealization extends AbstractClassExample{
  13.  
  14.     @Override
  15.     public void abstractMethodExample() {
  16.         System.out.println("Abstract method realizationg");
  17.     }
  18.    
  19. }
  20.  
  21. class Main{
  22.     public static void main(String[] args) {
  23.         AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
  24.         abstractClassRealization.abstractMethodExample();
  25.         abstractClassRealization.classicMethodExample();
  26.     }
  27. }

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

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

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

Код    
  1. package com.javamaster.javamastertests.config;
  2.  
  3. public abstract class AbstractClassExample {
  4.  
  5.     public abstract void abstractMethodExample();
  6.  
  7.     public void classicMethodExample(){
  8.         System.out.println("Classic method realisation");
  9.     }
  10. }
  11.  
  12. class AbstractClassRealization extends AbstractClassExample{
  13.  
  14.     @Override
  15.     public void abstractMethodExample() {
  16.         System.out.println("Abstract method realizationg");
  17.     }
  18.  
  19.     public void classicMethodExample(){
  20.         System.out.println("Classic overriden method");
  21.     }
  22.  
  23. }
  24.  
  25. class Main{
  26.     public static void main(String[] args) {
  27.         AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
  28.         abstractClassRealization.abstractMethodExample();
  29.         abstractClassRealization.classicMethodExample();
  30.     }
  31. }

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

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

Код    
  1. package com.javamaster.javamastertests.config;
  2.  
  3. public abstract class AbstractClassExample {
  4.  
  5.     public abstract void abstractMethodExample();
  6.  
  7.     public void classicMethodExample(){
  8.         System.out.println("Classic method realisation");
  9.     }
  10. }
  11.  
  12. class AbstractClassRealization extends AbstractClassExample{
  13.  
  14.     @Override
  15.     public void abstractMethodExample() {
  16.         System.out.println("Abstract method realizationg");
  17.     }
  18.  
  19.     public void classicMethodExample(){
  20.         System.out.println("Classic overriden method");
  21.     }
  22.  
  23. }
  24.  
  25. class Main{
  26.     public static void main(String[] args) {
  27.         AbstractClassRealization abstractClassRealization = new AbstractClassRealization();
  28.         abstractClassRealization.abstractMethodExample();
  29.         abstractClassRealization.classicMethodExample();
  30.  
  31.         //мы создали переменную с типом абстрактного класса
  32.         AbstractClassExample abstractClassExample = new AbstractClassRealization();
  33.         //но сработает всеравно метод класса наследника
  34.         abstractClassExample.classicMethodExample();
  35.     }
  36. }

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

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

Данный или похожий пример очень часто можно увидеть в различных тестах. Здесь важно понимать, что будет выполняться метод экземпляра (new AbstractClassRealization()), а не метод типа (AbstractClassExample).

Еще очень часто на собеседованиях можно услышать вопрос: может ли обычный класс иметь абстрактный метод? Ответ: не может. Абстрактный класс может иметь абстрактный и обычный метод, но обычный класс не может иметь абстрактный метод.

Это все, что хотелось рассказать об абстрактных классах в Java. С большим познанием основ ооп и принципов построения систем, Вы сможете умело управлять различными видами классов. И, однажды, абстрактный класс сможет выручить в сложных ситуациях программирования и проектирования систем.

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