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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как мы знаем, под абстракцией понимается сокрытие внутренней реализации функции и показ функциональности только пользователям. то есть что это работает (показывая), как это работает (скрывая). И абстрактный класс, и интерфейс используются для абстракции.

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

  1. Тип переменных:

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

2. Доступность членов данных:

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

3. Тип методов:

Абстрактный класс может содержать как абстрактные, так и неабстрактные методы. тогда как интерфейс содержит только абстрактные методы.

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

4. Декларация

Для объявления абстрактного класса используются абстрактные ключевые слова, а интерфейс может быть объявлен с помощью ключевого слова интерфейса.

5. Конструктор

Абстрактные классы могут иметь конструкторы, но интерфейсы не могут иметь конструкторов.

6. Наследование и абстракция

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

7. Несколько реализаций

Подкласс может расширять только один абстрактный класс, но может реализовывать несколько интерфейсов.

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

8. Множественное наследование:

Интерфейс поддерживает множественное наследование; абстракция не поддерживает множественное наследование.

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

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

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

Рассмотрите возможность использования абстрактных классов, если какое-либо из этих утверждений применимо к вашей ситуации:

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

Рассмотрите возможность использования интерфейсов, если какое-либо из этих утверждений применимо к вашей ситуации:

  • Это полная абстракция. Все методы, объявленные в интерфейсе, должны быть реализованы классом (ами), который реализует этот интерфейс.
  • Вы хотите указать поведение определенного типа данных, но не заботитесь о том, кто реализует его поведение.
  • Языки, которые не поддерживают множественное наследование на уровне классов, поэтому каждый класс может расширять только один суперкласс. Но класс может реализовать несколько интерфейсов. Таким образом, в большинстве случаев интерфейсы являются хорошим выбором для обеспечения базы для иерархии классов и контрактов. Кроме того, кодирование с точки зрения интерфейсов является одним из лучших методов кодирования.

Используйте абстрактные классы и интерфейс как

  • Совместное использование интерфейсов и абстрактных классов — лучший подход к проектированию системы. Например, в Java JDK java.util.List — это интерфейс, который содержит множество методов, поэтому существует абстрактный класс java.util.AbstractList, обеспечивающий скелетную реализацию всех методов интерфейса List, так что любой подкласс может расширять этот класс и реализовывать только необходимые методы. Мы всегда должны начинать с интерфейса в качестве основы и определять методы, которые должен реализовывать каждый подкласс, а затем, если есть некоторые методы, которые должен реализовывать только определенный подкласс, мы можем расширить базовый интерфейс и создать новый интерфейс с этими методами. Подклассы будут иметь возможность выбирать между базовым интерфейсом или дочерним интерфейсом для реализации в соответствии с его требованиями. Если количество методов сильно возрастает, неплохо было бы предоставить скелетный абстрактный класс, реализующий дочерний интерфейс и предоставляющий подклассам гибкость для выбора между интерфейсом и абстрактным классом.

❤ ❤ Спасибо, что прочитали эту статью ❤❤

Если я что-то не так? Дай мне знать в комментариях. Я хотел бы улучшить.

Хлопайте 👏 Если вам поможет эта статья.