Разное

Абстрактные классы java – Абстрактные классы в Java c примерами

Содержание

Абстрактные классы в Java c примерами

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

Почему классы называют «абстрактными»

Ты наверняка помнишь, что такое «абстракция» — мы это уже проходили 🙂 Если вдруг подзабыл — не страшно, вспомним: это принцип ООП, согласно которому при проектировании классов и создании объектов необходимо выделять только главные свойства сущности, и отбрасывать второстепенные. Например, если будем проектировать класс SchoolTeacher — школьный учитель — вряд ли понадобится характеристика «рост». Действительно: для преподавателя эта характеристика не важна. Но вот если мы будем создавать в программе класс BasketballPlayer — игрок в баскетбол — рост станет одной из главных характеристик. Так вот, абстрактный класс — это максимально абстрактная, о-о-о-чень приблизительная «заготовка» для группы будущих классов. Эту заготовку нельзя использовать в готовом виде — слишком «сырая». Но она описывает некое общее состояние и поведение, которым будут обладать будущие классы — наследники абстрактного класса.

Примеры абстрактных классов Java

Рассмотрим простой пример с машинами:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
Вот так выглядит самый простой абстрактный класс. Как видишь, ничего особенного 🙂 Для чего он может нам понадобиться? Прежде всего, он максимально абстрактно описывает нужную нам сущность — автомобиль. Слово abstract находится здесь недаром. В мире не существует «просто машин». Есть грузовики, гоночные автомобили, седаны, купе, внедорожники. Наш абстрактный класс — это просто «чертеж», по которому мы позже будем создавать классы-автомобили.
public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("Седан газует!");
   }

   @Override
   public void brake() {
       System.out.println("Седан тормозит!");
   }

}
Это во многом похоже на то, о чем мы говорили в лекциях про наследование. Только там у нас класс Car и его методы не были абстрактными. Но у такого решения есть целый ряд минусов, которые в абстрактных классах исправлены. Первое и главное — экземпляр абстрактного класса создать нельзя:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); 
   }
}
Эта «фишка» была реализована создателями Java специально. Еще раз, для запоминания: абстрактный класс — это просто чертеж для будущих «нормальных» классов. Тебе же не нужны экземпляры чертежа, правильно? Вот и экземпляры абстрактного класса создавать не надо 🙂 А если бы класс Car не был абстрактным, мы легко могли бы создавать его объекты:
public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       
   }

   public  void brake() {
       
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); 
   }
}
Теперь у нас в программе появилась какая-то непонятная машина — не грузовик, не гоночная, не седан, а вообще непонятно что. Та самая «просто машина», которых в природе не существует. Тот же пример можно привести с животными. Представь, если бы в твоей программе появились объекты Animal — «просто животное». Какого оно вида, к какому семейству относится, какие у него характеристики — непонятно. Было бы странно увидеть его в программе. Никаких «просто животных» в природе не существует. Только собаки, кошки, лисы, кроты и другие. Абстрактные классы избавляют нас от «просто объектов». Они дают нам базовое состояние и поведение. Например, у всех машин должна быть модель, цвет и максимальная скорость, а еще они должны уметь газовать и тормозить. Вот и все. Это — общая абстрактная схема, дальше ты уже сам проектируешь нужные тебе классы. Обрати внимание:
два метода в абстрактном классе тоже обозначены как abstract, и они вообще не реализованы. Причина та же: абстрактные классы не создают «поведения по умолчанию» для «просто машин». Они просто говорят, что должны уметь делать все машины. Впрочем, если поведение по умолчанию тебе все-таки нужно, методы в абстрактном классе можно реализовать. Java этого не запрещает:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Газуем!");
   }

   public abstract void brake();

   
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("Седан тормозит!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Вывод в консоль: “Газуем!” Как видишь, мы реализовали в абстрактном классе один метод, а второй не стали. В итоге поведение нашего класса Sedan разделилось на две части: если вызвать у него метод gas(), он «подтянется» из родительского абстрактного класса
Car
, а метод brake() мы переопределили в классе Sedan. Получилось очень удобно и гибко. Но теперь наш класс не такой уж и абстрактный? Ведь у него, по факту, половина методов реализована. На самом деле — и это очень важная особенность — класс является абстрактным, если хотя бы один из его методов является абстрактным. Хоть один из двух, хоть один из тысячи методов — без разницы. Мы можем даже реализовать все методы и не оставить ни одного абстрактного. Будет абстрактный класс без абстрактных методов. В принципе, это возможно, и компилятор не выдаст ошибок, но лучше так не делать: слово abstract потеряет смысл, а твои коллеги-программисты сильно удивятся, увидев такое :/ При этом, если метод помечен словом abstract, каждый класс-наследник должен его реализовать или быть объявленным как абстрактный. Иначе компилятор выбросит ошибку. Разумеется, каждый класс может наследоваться только от одного абстрактного класса, так что в плане наследования разницы между абстрактными и обычными классами нет. Неважно, наследуемся мы от абстрактного класса или от обычного, класс-родитель может быть только один.

Почему в Java нет множественного наследования классов

Мы уже говорили, что в Java нет множественного наследования, но так толком и не разобрались почему. Давай попробуем сделать это сейчас. Дело в том, что если бы в Java было множественное наследование, дочерние классы не могли бы определиться, какое именно поведение им выбрать. Допустим, у нас есть два класса — Toster и NuclearBomb:
public class Toster {


 public void on() {

       System.out.println("Тостер включен, тост готовится!");
   }

   public void off() {

       System.out.println("Тостер выключен!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Взрыв!");
   }
}
Как видишь, у обоих есть метод on(). В случае с тостером он запускает приготовление тоста, а в случае с ядерной бомбой — устраивает взрыв. Ой :/ А теперь представь, что ты решил (уж не знаю, с чего вдруг!) создать что-то среднее между ними. И вот он твой класс — MysteriousDevice! Этот код, разумеется, нерабочий, и мы приводим его просто в качестве примера «а как оно могло бы быть»:
public class MysteriousDevice extends Toster, NuclearBomb { public static void main(String[] args) { MysteriousDevice mysteriousDevice = new MysteriousDevice(); mysteriousDevice.on(); } }
Давай посмотрим, что у нас получилось. Загадочное устройство происходит одновременно и от Тостера, и от Ядерной Бомбы. У обоих есть метод on(), и в результате непонятно, какой из методов on() должен срабатывать у объекта MysteriousDevice, если мы его вызовем. Объект никак не сможет этого понять. Ну и в качестве вишенки на торте: у Ядерной Бомбы нет метода off(), так что если мы не угадали, отключить устройство будет нельзя. Именно из-за такой «непонятки», когда объекту неясно, какое поведение он должен выбрать, создатели Java отказались от множественного наследования. Впрочем, ты помнишь, что классы Java реализуют множество интерфейсов. Кстати, ты уже встречался в учебе как минимум с одним абстрактным классом! Хотя, может, и не заметил этого 🙂
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Это твой старый знакомый — класс Calendar. Он абстрактный, и у него есть несколько наследников. Одним из них — GregorianCalendar. Ты уже пользовался им в уроках о датах 🙂 Вроде бы все понятно, остался только один момент: в чем все-таки принципиальная разница между абстрактными классами и интерфейсами? Зачем в Java добавили и то, и другое, а не ограничились чем-то одним? Этого ведь вполне могло хватить. Об этом поговорим в следующей лекции! До встречи:)

javarush.ru

10 вопросов по абстрактным классам и интерфейсам с собеседований по Java

Абстрактные классы и интерфейсы очень популярны во всех объектно-ориентированных языках программирования. И практически на каждом собеседовании по Java попадается хотя бы один вопрос на эту тему. Интерфейсы упоминаются чаще, из-за их популярности среди проектировщиков ПО, но время от времени встречаются и вопросы по абстрактным классам. Последние чаще задают претендентам на должность джуниор-разработчиков, скажем, с не более чем двухлетним опытом разработки на Java, в то время как вопросы по интерфейсам чаще всего встречаются при собеседовании тех, чей опыт уже перевалил за четыре года. В основном, их задают вместе с другими вопросами по паттернам проектирования Java, например, по паттернам Decorator (Декоратор) или Factory (Фабрика).
В этой статье мы рассмотрим частые вопросы по абстрактным классам и интерфейсам, которые задавались на собеседованиях по Java разного уровня. Большинство из них не должно представлять сложности даже для начинающего Java-программиста. В основном это вопросы на чистое знание, но некоторые из них, например, о различиях между абстрактными классами и интерфейсами в Java или о том, когда лучше предпочесть абстрактный класс интерфейсу, могут оказаться достаточно непростыми. Предлагаем вам десяток интересных вопросов по теме.
Если вам когда-либо задавали на собеседовании или приходилось задавать какой-либо стоящий внимания вопрос об абстрактных классах и интерфейсах, но его в данном списке нет, делитесь им в комментариях.

1. Могут ли в языке Java у абстрактного класса быть конструкторы?

Да, в абстрактном классе в Java можно объявить и определить конструкторы. Поскольку создавать экземпляры абстрактных классов нельзя, вызвать такой конструктор можно только при формировании цепочки конструкторов, то есть при создании экземпляра конкретного класса-реализации. Но представьте, что интервьюер задаст затем вопрос: а какой смысл в конструкторе, если создать экземпляр абстрактного класса все равно нельзя? Дело в том, что его всё равно можно использовать для задания начальных значений общих переменных, объявленных в абстрактном классе и используемых различными реализациями. Даже если вы не объявили никакого конструктора, компилятор добавит в абстрактный класс конструктор по умолчанию без аргументов. Без него ваш подкласс не скомпилируется, поскольку первый оператор в любом конструкторе представляет собой неявный вызов super() – конструктора суперкласса по умолчанию в языке Java.

2. Могут ли абстрактные классы в языке Java реализовывать интерфейсы? Должны ли они реализовывать все методы?

Да, абстрактные классы могут реализовывать интерфейсы с помощью ключевого слова implements. Поскольку они абстрактные, то не обязаны реализовывать все методы. Наличие абстрактного базового класса и интерфейса для объявления типа является рекомендуемой практикой. Пример — интерфейс
java.util.List
и соответствующий абстрактный класс java.util.AbstractList. Поскольку AbstractList реализует все общие методы, то конкретные реализации (например, LinkedList и ArrayList) не должны реализовать все методы, как в случае, если бы они реализовали интерфейс List напрямую. Это решение сочетает преимущество использования интерфейса для объявления типа и гибкость абстрактного класса для реализации всего общего поведения в одном месте. В книге Джошуа Блоха «Java. Эффективное программирование» есть отличная глава на тему использования интерфейсов и абстрактных классов в Java, для лучшего понимания имеет смысл её изучить.

3. Может ли абстрактный класс быть final?

Нет, не может. Ключевое слово final означает, что класс на вершине иерархии, и у него не может быть наследников. А абстрактный класс без наследников — это сферический конь в вакууме, так как нельзя создать экземпляр abstract class. Таким образом, если класс одновременно abstract и final, то у него нет наследников и нельзя создать его экземпляр. Компилятор Java выдаст ошибку, если сделать класс одновременно abstract и final.

4. Могут ли у абстрактного класса в языке Java быть статические методы?

Да, абстрактные классы могут объявлять и определять статические методы. Только необходимо следовать общим принципам создания статических методов в Java, поскольку они нежелательны при объектно-ориентированном проектировании, ведь переопределение статических методов в Java невозможно. Статические методы в абстрактном классе – явление очень редкое, но, если на это есть уважительные причины, вам ничего не помешает их использовать.

5. Можно ли создать экземпляр абстрактного класса?

Нет, этого делать нельзя. Суть абстрактного класса заключается в том, что он не завершён, и его нужно завершить в классах-наследниках. То есть этот класс не готов к использованию. В нём, например, может отсутствовать реализация каких-то методов. Раз класс не готов к использованию, то нельзя создавать его объект. А вот экземпляры наследников абстрактного класса создавать можно. Компилятор Java выдаст ошибку, если программа попытается создать экземпляр абстрактного класса.

6. Обязательно ли в абстрактном классе должны быть абстрактные методы?

Нет, в абстрактном классе может не быть ни одного абстрактного метода. Сделать класс абстрактным в языке Java можно просто путем использования ключевого слова abstract при объявлении. Компилятор обеспечит выполнение всех структурных ограничений, например, запрета на создание экземпляров этого класса. Кстати, вопрос о том, должны ли быть абстрактные методы в абстрактном классе или интерфейсе – спорный. Мне представляется, что в абстрактном классе должны быть абстрактные методы, поскольку это первое, о чем думает программист, видя абстрактный класс. Это хорошо согласуется с принципом минимизации неожиданностей.

7. Каковы различия между абстрактным классом и интерфейсом в Java?

Это важнейший и один из самых классических вопросов на собеседованиях по языку Java. Я не могу сосчитать, сколько раз встречал этот вопрос на собеседованиях по Java для всех уровней. Интересным этот вопрос делает, в частности, возможность для соискателя представить пример. Отвечать на вопросы по основам объектно-ориентированного программирования, например, рассказать об абстракции, инкапсуляции, полиморфизме и наследовании, легко, но, когда дело доходит до подобных тонких нюансов, претенденты на должность очень часто теряются и говорят, что первое приходит в голову. Ответ на этот вопрос тянет на отдельную статью (особенно после изменений в Java 8), тем не менее, если кратко:
  • Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть.

  • Абстрактный класс наследуется (etxends), а интерфейс — реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов — сколько угодно. Интерфейс может наследовать (extends) другой интерфейс/интерфейсы.

  • Абстрактные классы используются, когда есть отношение "is-a", то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом.

8. Когда имеет смысл предпочесть абстрактный класс интерфейсу и наоборот?

Это продолжение предыдущих вопросов по абстрактным классам и интерфейсам. Если вы знаете, каковы их синтаксические различия, то ответ на этот вопрос не доставит вам проблем, так как именно они служат определяющим фактором принятия решения. Поскольку в опубликованный интерфейс практически невозможно добавить новый метод, в случае потенциальной необходимости доработки лучше использовать абстрактный класс. Развивать абстрактные классы в Java проще, чем интерфейсы. Аналогично, если в интерфейсе слишком много методов и реализация их всех становится настоящей головной болью, лучше создать абстрактный класс для реализации по умолчанию. Этому паттерну следуют и в пакете коллекций Java, абстрактный класс AbstractList обеспечивает реализацию по умолчанию для интерфейса List. Используйте абстрактные классы, если:
  • Вы хотите поделиться кодом между несколькими тесно связанными классами.

  • Вы ожидаете, что классы, которые расширяют ваш абстрактный класс, имеют много общих методов или полей, или требуют других модификаторов доступа, кроме public (например, protected и private).

  • Вы хотите объявить нестатические или не-final поля. Это позволяет вам определять методы, которые могут получить доступ и изменить состояние объекта, которому они принадлежат.
Используйте интерфейсы, если:
  • Вы ожидаете, что несвязанные классы будут реализовывать ваш интерфейс. Например, интерфейсы Comparable и Cloneable реализуются многими несвязанными классами.

  • Вы хотите определить поведение конкретного типа данных, но вам не важно, кто его реализует.

  • Вы хотите использовать множественное наследование типа.

9. Что такое абстрактный метод в языке Java?

Абстрактный метод – это метод без тела. Вы просто объявляете метод, не определяя его, с использованием ключевого слова abstract в объявлении метода. Все объявленные внутри интерфейса в языке Java методы – по умолчанию абстрактные. Вот пример абстрактного метода в языке Java:
public void abstract printVersion();
Теперь, для реализации этого метода необходимо расширить абстрактный класс и этот метод переопределить.

10. Может ли абстрактный класс в Java содержать метод main?

Да, абстрактный класс в Java может содержать метод main, ведь это просто еще один статический метод, и абстрактный класс можно выполнять при помощи метода main, если не создавать его экземпляров. Вот и всё, что я хотел рассказать. И помните: абстрактные классы и интерфейсы – ключевые проектные решения в процессе объектно-ориентированного анализа и проектирования, и применять их следует с должной осмотрительностью, конечно, если вы хотите создать гибкую систему.

javarush.ru

Курс Java Core - Лекция: Абстрактные классы

— Привет, Амиго! Новая интересная тема.

— Да сегодня просто день интересных тем!!

— Спасибо!

— Да не за что.

— Помнишь ситуацию, когда мы ввели базовый класс ChessItem для упрощения всех классов шахматных фигур?

— Да.

— Теперь представь, что у каждой фигуры есть метод, который занимается ее отрисовкой на экране. Вызываешь метод, и фигура сама себя рисует в своих текущих координатах. Удобно было бы вынести этот метод в базовый класс?

— Да. После того, что я узнал о полиморфизме, можно было бы вызывать метод отрисовки для всех фигур, независимо от их типа. Примерно так:

Пример

class ChessBoard
{
  public void drawAllChessItems()
  {
  
  ArrayList items = new ArrayList();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

— Молодец. Именно так. А что бы отрисовал на экране метод draw самого класса ChessItem?

— Не знаю. Такой фигуры ведь в шахматах нет. Значит, и изображения у нее нет.

— Именно. Более того, создавать объекты типа ChessItem – не имеет смысла. Это не фигура из шахмат, всего лишь абстракция — класс, который мы сделали для удобства. Так работает абстракция из ООП: мы вынесли важные (общие для всех фигур) данные и методы в базовый класс, а их различия оставили в их классах.

Для такого случая в Java есть специальный тип классов – абстрактные классы. Вот три вещи, которые стоит помнить об абстрактных классах.

1) Абстрактный класс может содержать объявление метода без его реализации. Такой метод называется абстрактным.

Пример

public abstract class ChessItem
{
 public int x, y; 
 private int value; 

 public int getValue() 
 {
   return value;
 }

 public abstract void draw(); 

}

javarush.ru

Абстрактные классы и интерфейсы. Курс "Программирование на Java"

От абстрактных классов и интерфейсов нельзя создавать объекты. Они служат своего рода шаблонами для обычных классов.

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

Интерфейс – это в большинстве случаев определенная функциональность. Например, способность летать, распаковывать архив, парсить страницу. Интерфейс может наследоваться любым классом. Интерфейс отвечает на вопрос "у кого что есть". Например, у самолетов и птиц есть способность к полету. Несвязанные между собой ближайшим общим предком классы могут наследовать один и тот же интерфейс.

Один класс может использовать несколько интерфейсов. Этим объясняется их популярность в Java, так как здесь отсутствием множественное наследование классов.

В Java, чтобы объявить класс абстрактным, надо в заголовке прописать слово abstract. Также обычно должен быть хотя бы один абстрактный метод. Рассмотрим пример:

public class AbstrTest {
    public static void main(String[] args) {
        UsualClass a = new UsualClass();
        a.strPrint();
        a.intPrint();
    }
}
 
abstract class AbstrClass {
 
    abstract void strPrint();
 
    void intPrint() {
        System.out.println(1);
    }
}
 
class UsualClass extends AbstrClass {
    void strPrint() {
        System.out.println("hi");
    }
}

В данном случае

  • Нельзя создавать объекты от класса AbstrClass, так как в его заголовке есть слово abstract. (Однако переменную такого типа можно было бы создать.)

  • Нельзя опустить реализацию метода strPrint() в классе UsualClass, поскольку он наследник абстрактного класса, в котором указанный метод объявлен абстрактным.

  • Абстрактные методы не имеют тел.

  • Если бы класс AbstrClass не содержал абстрактный strPrint(), или метод был бы не абстрактным, то в UsualClass можно было бы не переопределять данный метод. Таким образом, объявляя абстрактные методы, мы заставляем дочерние классы придерживаться определенного стандарта.

  • Абстрактный класс может не иметь абстрактных методов. Отличие такого класса от обычного родительского только в том, что от него нельзя создавать объекты.

При определении интерфейсов вместо class пишется ключевое слово interface. Если есть родительские интерфейсы, они также как в случае классов перечисляются после слова extends. У интерфейсов не может быть родительских классов.

Поскольку все методы интерфейсов по умолчанию абстрактные и публичные, перед их именами не требуется писать соответствующих модификаторов.

Если класс использует интерфейс, имя интерфейса указывается после слова implements (реализует). В случае наследования нескольких интерфейсов они перечисляются через запятую. Наследовать интерфейсы могут как обычные, так и абстрактные классы.

Если класс является наследником как другого класса, так интерфейса, в его заголовке сначала пишется extends имя_класса, затем implements имя_интерфейса.

...
interface InterFace {
    String getStr();
}
 
class UsualClass extends AbstrClass implements InterFace {
    void strPrint() {
        System.out.println("hi");
    }
    public String getStr() {
        return "HI";
    }
}

Если не указать слово public в реализации метода getStr(), будет ошибка.

Зачем нужны абстрактные методы, будь они в абстрактных классах или интерфейсах, если вся их реализация ложится на плечи дочерних классов? Если вы создаете группу порожденных от сестринских классов объектов, то можете присваивать их переменным типа абстрактного класса или интерфейса и обрабатывать всю группу, например, в одном цикле. У всей группы будут одни и те же методы, хотя реализация будет зависеть от типа объекта.

import java.util.ArrayList;
 
public class ListObjects {
    public static void main(String[] args) {
        ArrayList<Animal> house = new ArrayList<>();
        house.add(new Cat());
        house.add(new Dog());
        house.add(new Dog());
 
        for (Animal animal : house) {
            animal.voice();
        }
    }
}
 
abstract class Animal {
    abstract void voice();
}
 
class Cat extends Animal {
    void voice() {
        System.out.println("Meow");
    }
}
 
class Dog extends Animal {
    void voice() {
        System.out.println("Woof");
    }
}

Приведенная программа один раз мяукнет и два раза гавкнет, так как для каждого животного будет вызвана его реализация метода. Это также пример полиморфизма.

В случае наследования интерфейса было бы так:

...
interface Animal {
    void voice();
}
 
class Cat implements Animal {
    public void voice() {
        System.out.println("Meow");
    }
}
 
class Dog implements Animal {
    public void voice() {
        System.out.println("Woof");
    }
}

В Java над переопределяемыми методами принято писать аннотацию @Override. Так при взгляде на класс сразу понятно, что метод не определяется, а переопределяется.

В последних версиях языка Java в интерфейсах можно писать реализацию методов. Перед такими методами добавляется ключевое слово default:

interface Animal {
 
    void voice();
 
    default void drink() {
        System.out.println("I drink!");
    }
}

younglinux.info

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

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

java-master.com

Абстрактный класс и интерфейс в Java 2019

Абстрактный класс и интерфейс оба в основном используются для абстракции, однако они сильно отличаются друг от друга. Оба являются основной частью Java, но имеют собственное применение. Хотя оба термина могут быть синонимом друг друга, они не могут использоваться взаимозаменяемо.

Между ними существуют значительные различия. Хотя по умолчанию метод интерфейса является абстрактным, абстрактный может содержать как абстрактные, так и не абстрактные методы. Ну, так как Java 8, интерфейсы также имеют реализации методов, и они могут иметь как статические, так и стандартные методы в Java. Давайте подробно рассмотрим разницу между ними.

Что такое абстрактный класс в Java?

Абстрактным классом в Java является класс, объявленный абстрактным - он может содержать или не содержать абстрактные методы. Это очень похоже на интерфейс Java, за исключением того факта, что он может содержать реализацию метода по умолчанию. Как и в объектно-ориентированном программировании, абстракция в Java достигается с помощью абстрактных классов и интерфейсов. В Java абстракция означает скрытие нерелевантных деталей от пользователя, чтобы сосредоточиться только на основных деталях для повышения эффективности, что уменьшает сложность. Ключевое слово «abstract» используется для создания абстрактного класса непосредственно перед ключевым словом класса в объявлении класса.

Абстрактный класс может содержать или не содержать методы абстракции (методы без тела), но если класс имеет хотя бы один метод абстракции, он должен быть объявлен абстрактным. Однако не абстрактные методы могут использоваться только в абстрактном классе, но только для реализации поведения по умолчанию. Методы абстрактного класса могут иметь модификаторы доступа, такие как частные, общедоступные, статические и защищенные, в зависимости от уровня видимости. Абстрактный класс не может быть создан, и он не обеспечивает 100-процентную абстракцию из-за того, что он может иметь конкретный метод.

Что такое интерфейс?

Интерфейс, хотя выглядит как класс, это не так. Поскольку Java не поддерживает множественные наследования, интерфейс иногда идеален для обеспечения базы для иерархии классов. Интерфейс - это скорее проект класса, который также используется для достижения абстракции в Java. Он содержит абстрактные методы и статические константы. Говоря простыми словами, интерфейс представляет собой набор абстрактных метод

ru.esdifferent.com

Разница между абстрактным классом и интерфейсом в Java

Термин «Абстракция» означает скрытие внутренней реализации функции и только отображение функциональности для пользователей. Это означает, что абстрактный класс является классом, который частично реализуется программистом. Он может содержать один или несколько абстрактных методов. Он не может быть создан, он может использоваться только как суперкласс по своим подклассам. Эти методы - это просто определения функций, которые говорят разработчику, что метод должен быть реализован в дочернем классе. Абстрактные классы используются для создания шаблона для его подклассов, он может захватывать общие характеристики подклассов.

Интерфейс

Интерфейс - это тип, который содержит только сигнатуры методов, делегатов или событий и не имеет реализации. Реализация методов выполняется классом, который реализует интерфейс. Это полностью абстрактный класс; ни один из его методов не реализован, и вместо того, чтобы подклассифицировать класс от него, говорят, что он реализует этот интерфейс. Поэтому, если класс реализует интерфейс, он говорит внешнему миру, что он обеспечивает конкретное поведение.

Ключевыми техническими отличиями между абстрактным классом и интерфейсом являются:
  1. Абстрактный класс может иметь абстрактные и не абстрактные методы, тогда как интерфейс могут иметь только абстрактные методы. Начиная с Java 8, он может также иметь стандартные и статические методы.
  2. Абстрактные классы могут иметь константы, члены, заглушки методов (методы без тела) и определенные методы, тогда как интерфейсы могут иметь только заглушки констант и методов.
  3. Абстрактные классы могут иметь конструкторы, но интерфейсы могут иметь конструкторы.
  4. Абстрактные методы классов могут иметь модификаторы доступа с любой видимостью, но методы интерфейса неявно публичны и абстрактны .
  5. Абстрактные классы могут иметь основной метод, поэтому мы можем запускать его, тогда как интерфейс не имеет основного метода, поэтому мы не можем его запускать.
  6. Абстрактный класс может расширять один другой класс и может реализовывать один или несколько интерфейсов, но интерфейс может распространяться только на один или несколько интерфейсов.
  7. Детский класс может определять абстрактные методы с тем же или менее ограничительная видимость, тогда как класс, реализующий интерфейс, должен определять методы с одинаковой видимостью (public).
  8. По сравнению с Interf ace, абстрактный класс быстрее, чем интерфейс, потому что интерфейс несколько медленнее, так как требуется некоторое время, чтобы найти реализованный метод в классе.
  9. В абстрактном ключе ключевое слово "abstract" является обязательным для объявления метода как абстрактное, тогда как в ключе ключевое слово интерфейса «абстрактный» необязательно объявлять метод как абстрактный

Источник: http://net-informations.com/Java/cJava/abstract.htm

bunkerbook.ru

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *