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

Интерфейсы и абстрактные классы

Интерфейсы и абстрактные классы используются в объектно-ориентированном программировании для расширения других классов… Помечено как ооп, учебник, для начинающих, java.

Интерфейсы и абстрактные классы используются в объектно-ориентированном программировании для расширения других классов и добавления дополнительных функций без переписывания или дублирования кода. Разница между интерфейсами и абстрактными классами по сравнению с созданием обычного базового класса заключается в том, что вы не можете создать экземпляр интерфейса или абстрактного класса. Если вы создадите абстрактный класс под названием “Животное”, вы не сможете создать новый экземпляр животного.

Приведенный ниже код определяет интерфейс под названием “Can Talk”, в котором есть один метод, называемый “talk”. Из-за того, что это интерфейс, мы не определяем тело метода, поскольку оно определено в классах, которые наследуются от этого интерфейса. Метод talk возвращает переменную строкового типа, поэтому любой класс, наследующий этот интерфейс, должен возвращать строковую переменную при заполнении тела этого метода.

interface CanTalk{

  String talk();

}

Приведенный ниже код определяет абстрактный класс под названием “Животное”. Этот класс имеет одно закрытое поле под названием “имя”, представляющее собой строковый тип данных, один метод получения, который возвращает это поле. Поле передается в конструктор этого класса и присваивается внутренней переменной под названием “имя”. Поскольку это абстрактный класс, экземпляр животного не может быть создан. Все поля, методы и аргументы конструктора наследуются, когда дочерний класс наследуется от класса Animal.

abstract class Animal{

  private String name;

  public Animal(String name){
    this.name = name; 
  }

  public String getName(){
    return name; 
  }

}

Класс ‘Dog’ наследуется от абстрактного класса ‘Animal’ и интерфейса ‘CanTalk’. Класс Dog должен передать переменную суперконструктору, определяемому в классе Animal. Мы также должны определить тело метода “talk”, определенного в интерфейсе “CanTalk”, из-за наследования от этого интерфейса.

class Dog extends Animal implements CanTalk{

  public Dog(String name){
    super(name);
  }

  @Override
  public String talk(){
    return "Woof"; 
  }

}

Теперь мы можем использовать наш класс ‘Dog’ для создания экземпляра класса и присвоения его переменной под названием ‘fido’. Переменная fido присваивает строковое значение “Fido” полю имени. Переменная fido может вызывать как методы ‘getName’, так и ‘talk’ из-за структуры наследования, описанной выше.

Dog fido = new Dog("Fido");
System.out.println(fido.getName());
System.out.println(fido.talk());

Полиморфизм также применим к интерфейсам и абстрактным классам. Мы можем объявить тип переменной абстрактного класса, такого как Animal, или интерфейса, такого как Can Talk. Однако, когда мы инициализируем переменную, она должна быть конкретным классом (а не интерфейсом или абстрактным классом). Кроме того, объект может вызывать только методы и поля доступа, которые существуют в пределах объявленного типа. Что касается приведенного ниже кода, переменная ‘buddy’ может обращаться только к вещам, определенным внутри абстрактного класса ‘Animal’, а переменная ‘duke’ может обращаться только к методам, объявленным в интерфейсе ‘CanTalk’. Помните, что объявленный тип переменной находится слева от символа равенства=’.

Animal buddy = new Dog("Buddy");
CanTalk duke = new Dog("Duke");

Эта статья была первоначально опубликована на моем сайте: Эта статья была первоначально опубликована на моем сайте:

Оригинал: “https://dev.to/acroynon/interfaces-and-abstract-classes-4414”