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

Наследование и полиморфизм

Наследование – это способ основывать один класс на другом классе, подобно шаблону, построенному на основе существующего храма… С тегами ооп, java, учебник, информатика.

Наследование – это способ основывать один класс на другом классе, как шаблон, построенный на основе существующего шаблона. Вы можете создать класс под названием “Собака”, который действует как шаблон для всех объектов Dog. Затем мы могли бы создать другой класс под названием “Животное”, который является родительским классом нашего класса “Собака”. Все собаки – животные, но не все животные – собаки. Наш класс животных мог бы определять функциональность для всех животных, а затем класс Собак мог бы использовать всю эту функциональность, не переписывая ее, путем расширения/наследования от класса животных. Затем класс Dog мог бы добавить больше функций, больше переменных и методов, специфичных только для объектов Dog.

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

class Animal{

  private String name;

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

  public String getName(){
    return this.name; 
  }

}

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

class Dog extends Animal{

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

  public String bark(){
    return "Woof"; 
  }

}

Этот код объявляет и инициализирует объект Dog с именем “приятель” и передает конструктору строковое значение “Приятель”. Это означает, что в поле имя будет установлено значение “Приятель”. Мы также можем вызвать метод “getName” из класса Animal, поскольку мы расширили его. Несмотря на то, что мы объявили метод непосредственно в классе Dog, мы все равно можем использовать эту функциональность через наследование. В последней строке вызывается метод ‘bark’, который непосредственно объявлен в классе Dog.

Dog buddy = new Dog("Buddy");
System.out.println(buddy.getName());
System.out.println(buddy.bark());

Приведенный ниже код немного отличается от приведенного выше кода. В этом фрагменте кода мы объявляем переменную с именем ‘fido’, которая объявлена как тип животного, но инициализирована как объект Dog. Это и есть полиморфизм. Поскольку собака происходит из класса Animal, мы можем рассматривать ее как Животное и объявлять ее как тип переменной Animal. Мы не можем сделать обратное, потому что класс Животных не распространяется на класс Собак (не все Животные являются собаками).

Вторая строка вызывает метод ‘getName’, который возвращает строковое значение “Fido”, так как это значение мы передали конструктору объекта. В последней строке вызывается метод ‘bark’, объявленный в классе Dog. Это приведет к ошибке и не сработает. Это связано с тем, что переменная ‘fido’ обрабатывается как тип данных Animal, а класс Animal не объявляет метод ‘bark’ (класс Dog объявляет этот метод). Вот почему этот вызов метода не будет работать, так как объект объявлен как Животное, а не Собака. Нам пришлось бы объявить переменную ‘fido’ как тип переменной Dog, чтобы получить доступ к этому методу. Помните, что левая сторона символа равенства “=” – это объявление, а правая сторона – инициализация.

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

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

Оригинал: “https://dev.to/acroynon/inheritance-and-polymorphism-33fi”