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

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

  • В интерфейсе класс может реализовывать несколько интерфейсов, тогда как класс может наследовать только один абстрактный класс.
  • В интерфейсе нет модификаторов доступа. Предполагается, что все, что определено внутри интерфейса, имеет модификатор public, тогда как абстрактный класс может иметь модификатор доступа.
  • Интерфейс не может содержать поля данных, тогда как абстрактный класс может иметь поля данных.
  • Интерфейсы помогают определить периферийные возможности класса, тогда как абстрактный класс определяет идентичность класса.

Интерфейс против абстрактного класса в Java

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

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

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

Абстрактные классы не могут быть созданы.

Важные причины использования интерфейсов

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

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

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

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

Интерфейс — это план, который можно использовать для реализации класса. Интерфейс не содержит конкретных методов (методов, имеющих код). Все методы интерфейса являются абстрактными методами.

Интерфейс не может быть создан. Однако классы, реализующие интерфейсы, могут быть созданы. Интерфейсы никогда не содержат переменных экземпляра, но они могут содержать общедоступные статические конечные переменные (т. е. постоянные переменные класса).

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

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

параметры Интерфейс Абстрактный класс
Скорость Замедлять Быстрый
Множественное наследство Реализуйте несколько интерфейсов Только один абстрактный класс
Структура Абстрактные методы Абстрактные и конкретные методы
Когда использовать Будущее улучшение Чтобы избежать независимости
Наследование/реализация Класс может реализовывать несколько интерфейсов Класс может наследовать только один абстрактный класс.
Реализация по умолчанию При добавлении новых элементов в интерфейс сложно найти всех разработчиков и реализовать новые определенные элементы. В случае абстрактного класса вы можете воспользоваться реализацией по умолчанию.
Модификаторы доступа Интерфейс не имеет модификаторов доступа. Все, что определено внутри интерфейса, считается общедоступным модификатором. Абстрактный класс может иметь модификатор доступа.
Когда использовать Лучше использовать интерфейс, когда различные реализации используют только сигнатуру метода. Полиморфная иерархия типов значений. Его следует использовать, когда различные реализации одного и того же типа имеют общее поведение.
Поля данных интерфейс не может содержать поля данных. класс может иметь поля данных.
Множественное наследование по умолчанию Класс может реализовывать множество интерфейсов. Класс наследует только один абстрактный класс.
Реализация Интерфейс является абстрактным, поэтому он не может предоставлять никакого кода. Абстрактный класс может предоставлять полный код по умолчанию, который следует переопределить.
Использование модификаторов доступа Вы не можете использовать модификаторы доступа для метода, свойств и т. д. Вы можете использовать абстрактный класс, содержащий модификаторы доступа.
Применение Интерфейсы помогают определить периферийные возможности класса. Абстрактный класс определяет идентичность класса.
Определенные поля Поля не могут быть определены Абстрактный класс позволяет определять как поля, так и константы.
наследование Интерфейс может наследовать несколько интерфейсов, но не может наследовать класс. Абстрактный класс может наследовать класс и несколько интерфейсов.
Конструктор или деструкторы Интерфейс не может объявлять конструкторы или деструкторы. Абстрактный класс может объявлять конструкторы и деструкторы.
Ограничение расширений Он может расширять любое количество интерфейсов. Одновременно он может расширять только один класс или один абстрактный класс.
Абстрактное ключевое слово В ключевом слове абстрактного интерфейса необязательно объявлять метод как абстрактный. В абстрактном классе ключевое слово Abstract является обязательным для объявления метода как абстрактного.
Тип класса Интерфейс может иметь только публичные абстрактные методы. У абстрактного класса есть защищенные и общедоступные абстрактные методы.

Пример кода для интерфейса и абстрактного класса в Java

Фоллоwing это пример кода для создания интерфейса и абстрактного класса в Java

Синтаксис интерфейса

interface name{
//methods
}

Пример Java-интерфейса:

interface Pet {
    public void test();
}
class Dog implements Pet {
    public void test() {
        System.out.println("Interface Method Implemented");
    }
    public static void main(String args[]) {
        Pet p = new Dog();
        p.test();
    }
}

Синтаксис абстрактного класса

abstract class name{
    // code
}

Пример абстрактного класса:

abstract class Shape {
    int b = 20;
    abstract public void calculateArea();
}

public class Rectangle extends Shape {
    public static void main(String args[]) {
        Rectangle obj = new Rectangle();
        obj.b = 200;
        obj.calculateArea();
    }
    public void calculateArea() {
        System.out.println("Area is " + (b * b));
    }
}