Рубрики
Без рубрики

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

Вступление Эта серия будет посвящена базовому пониманию Java…. С пометкой “java”, “новички”, “тристан”.

  • Эта серия будет посвящена базовому пониманию Java. Всякий раз, когда я ловлю себя на том, что спрашиваю: “Как это работает?”. Я создам сообщение в блоге и размещу его здесь. Эта серия не будет в порядке, поэтому не стесняйтесь читать любой пост, который вы сочтете наиболее актуальным.

  • Всю информацию, которую я использовал для этого поста в блоге, можно найти Здесь

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

  • Абстрактный класс – это класс, в объявлении которого есть ключевое слово abstract , и он может включать или не включать абстрактные методы. Абстрактные классы не могут быть созданы, но они могут быть подклассами.
  • Абстрактный метод – это метод, который объявлен без реализации (без тела метода) и за которым следует точка с запятой, например:
 abstract void abstractMethod(int num);
  • Если класс включает абстрактный метод, то сам класс должен быть объявлен абстрактным. Когда абстрактный класс является подклассом, подкласс должен предоставлять реализации для всех абстрактных методов в своем родительском классе. Однако, если это не так, то подкласс также должен быть объявлен абстрактным.

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

  • Абстрактные классы похожи на интерфейсы. Вы не можете создавать их экземпляры, и они могут содержать сочетание методов, объявленных с реализацией или без нее. Однако с помощью абстрактных классов вы можете определять поля, которые не являются статическими и конечными, а также определять общедоступные, защищенные и частные конкретные методы. С интерфейсами все поля автоматически становятся общедоступными, статическими и конечными, все методы, которые мы объявляем, являются общедоступными, например:
public interface TestingInterface{
    public static final int nine =9;
    private int ten = 10;

    public abstract void publicVoidMethod();
    private void privateMethod();
     void normalMethod(int another);
}

  • Если вы скопируете и вставите приведенный выше код в выбранную вами Java IDE, обратите внимание на предупреждения и ошибки. Во-первых, давайте посмотрим на предупреждения, public static final int; выдает нам предупреждение о том, что модификаторы являются избыточными. Это подтверждает для нас, что все переменные внутри интерфейса уже определены как общедоступные, статические и конечные. Второе предупреждение исходит от метода public Void Method() , в котором снова указывается, что модификаторы являются избыточными, поскольку каждый метод внутри интерфейса автоматически объявляется общедоступным и абстрактным.

  • Теперь мы можем посмотреть на ошибки, которые выдает нам наш код. Ошибки исходят из переменной ten и метод private Method() , указывающий , что модификатор private не разрешен. Эта ошибка возникает из-за модификаторов доступа (private и protected) и доказывает, что мы не можем изменить модификаторы доступа внутри интерфейса. Таким образом, по умолчанию все методы объявляются общедоступными и абстрактными, а все переменные объявляются общедоступными, статическими и конечными.

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

Почему все общедоступно в интерфейсе?

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

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

public abstract class TestingInterface{
    public static final int nine =9;
    private int ten = 10;

    public abstract void publicVoidMethod();
    private void privateMethod();
     void normalMethod(int another);
}
  • Теперь, чтобы переключить наш интерфейс на абстрактный класс, мы просто меняем interface в абстрактный класс . Обратите внимание, что мы не получаем никаких предупреждений и только две ошибки от private Method() и обычный метод() , оба имеют одинаковую ошибку, Отсутствует тело метода или объявляется абстрактным . Чтобы исправить ошибки, все, что нам нужно сделать, это объявить оба метода как абстрактные.
     private abstract void privateMethod();
     abstract void normalMethod(int another);
  • Как вы заметите, мы по-прежнему получаем еще одну ошибку, Незаконная комбинация модификаторов: 'abstract' и 'private' . Очевидно, что частный метод не может быть абстрактным. Если бы у нас был базовый класс, который содержал частный абстрактный метод, мы никогда не смогли бы реализовать абстрактный метод из-за его частного модификатора. Чтобы избавиться от ошибки, просто удалите private из private Method() .
abstract void privateMethod();

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

  • Ниже приведены 3 примера, с которыми, если вы когда-нибудь столкнетесь, вам следует рассмотреть возможность использования абстрактного класса поверх интерфейса.

1) Вы хотите разделить код между несколькими тесно связанными классами.

2) Классы, расширяющие наш абстрактный класс, имеют много общих методов или полей или требуют доступа к модификаторам, отличным от общедоступных (частных, защищенных).

3) Вы хотите объявить нестатические или не окончательные поля. Это позволяет нам определять методы, которые могут получать доступ и изменять состояние объекта, к которому они принадлежат.

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

  • Ниже приведены 3 примера, с которыми, если вы когда-нибудь столкнетесь, вам следует рассмотреть возможность использования интерфейса поверх абстрактного класса.

1) Вы ожидаете, что несвязанные классы будут реализовывать интерфейс.

2) Вы хотите указать сигнатуру метода, но не беспокоитесь о том, как реализуется поведение методов

3) Вы хотите воспользоваться преимуществами множественного наследования.

  • Спасибо вам за то, что нашли время в свой рабочий день, чтобы прочитать этот мой пост в блоге. Если у вас есть какие-либо вопросы или сомнения, пожалуйста, прокомментируйте ниже или свяжитесь со мной по адресу Твиттер .

Оригинал: “https://dev.to/theplebdev/java-quickie-abstract-classes-vs-interfaces-1cl0”