Статьи

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

Некоторые из популярных вопросов интервью: «В чем разница между абстрактным классом и интерфейсом», «Когда вы будете использовать абстрактный класс и когда вы будете использовать интерфейс». Итак, в этой статье мы пройдем эту тему.

Прежде чем перейти к различиям между ними, давайте рассмотрим их введение.

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

Абстрактные классы создаются для захвата общих характеристик подклассов. Его нельзя создать, его подклассы можно использовать только как суперкласс. Абстрактные классы используются для создания шаблона для его подклассов вниз по иерархии.

Давайте возьмем пример класса JDK GenericServlet:

1
2
3
4
5
6
7
8
public abstract class GenericServlet implements  Servlet, ServletConfig,Serializable{   
// abstract method     
    abstract  void     service(ServletRequest req, ServletResponse res) ; 
    void init()     {
         // Its implementation        
     }  
       // other method related to Servlet   
}

Когда HttpServlet расширяет универсальный сервлет, он обеспечивает реализацию метода service ():

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class HttpServlet extends GenericServlet
{
       void  service(ServletRequest req, ServletResponse res)
       {
       // implementation
}
     protected  void  doGet(HttpServletRequest req, HttpServletResponse resp)
{
    // Implementation
}
 
   protected  void  doPost(HttpServletRequest req, HttpServletResponse resp)
{
    // Implementation
}
 
// some other methods related to HttpServlet
}

Интерфейс

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

Давайте возьмем пример внешнего интерфейса:

01
02
03
04
05
06
07
08
09
10
public interface Externalizable
extends Serializable
{
 
    void writeExternal(ObjectOutput out)
            throws IOException;
    void readExternal(ObjectInput in)
            throws IOException,
            ClassNotFoundException;
}

Когда вы реализуете этот интерфейс, вы должны реализовать два вышеупомянутых метода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
public class Employee implements Externalizable{
 
 int employeeId;
 String employeeName;
 
 
 @Override
 public void readExternal(ObjectInput in) throws IOException,
 ClassNotFoundException {  employeeId=in.readInt();
  employeeName=(String) in.readObject();
   
 @Override
 public void writeExternal(ObjectOutput out) throws IOException {
 
  out.writeInt(employeeId);
  out.writeObject(employeeName); }
}

Абстрактный класс против интерфейса

параметр Абстрактный класс Интерфейс
Реализация метода по умолчанию Может иметь реализацию метода по умолчанию Интерфейсы — это чистая абстракция. Не может быть реализации вообще.
Реализация Подклассы используют ключевое слово extends для расширения абстрактного класса, и они должны обеспечивать реализацию всех объявленных методов в абстрактном классе, если только подкласс не является также абстрактным классом. подклассы используют ключевое слово Implements для реализации интерфейсов и должны обеспечивать реализацию для всех методов, объявленных в интерфейсе.

Конструктор
Абстрактный класс может иметь конструктор Интерфейс не может иметь конструктор
Отличается от обычного Java-класса Абстрактные классы почти такие же, как классы Java, за исключением того, что вы не можете создать их экземпляр. Интерфейсы совсем другого типа
Модификатор доступа Методы абстрактного класса могут иметь публичный, защищенный, приватный и модификатор по умолчанию Методы интерфейса по умолчанию общедоступны. вы не можете использовать любой другой модификатор доступа с ним
Основной () метод Абстрактные классы могут иметь метод main, поэтому мы можем его запустить Интерфейс не имеет основного метода, поэтому мы не можем его запустить.
Множественное наследование Абстрактный класс может расширять еще один класс и может реализовывать один или несколько интерфейсов. Интерфейс может распространяться только на один или несколько интерфейсов.
скорость Это быстрее, чем интерфейс Интерфейс несколько медленнее, так как поиск метода в классе занимает некоторое время
Добавление нового метода Если вы добавляете новый метод в абстрактный класс, вы можете обеспечить его реализацию по умолчанию. Таким образом, вам не нужно менять свой текущий код Если вы добавляете новый метод в интерфейс, вы должны изменить классы, которые реализуют этот интерфейс

Когда использовать Абстрактный класс и интерфейс:

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

Введение стандартных и статических методов в Java 8

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