Что означает ключевое слово extends
Перейти к содержимому

Что означает ключевое слово extends

Что означает ключевое слово extends

В этой статье сделана попытка объяснить некоторые термины объектно-ориентированного программирования Java, и ответить на вопросы: что значит слово extends в определении класса? Что значит слово implements в определении класса? В чем разница между extends и implements? Что такое interface? Что такое @Override?

Если коротко, то:

extends это ключевое слово, предназначенное для расширения реализации какого-то существующего класса. Создается новый класс на основе существующего, и этот новый класс расширяет (extends) возможности старого.

implements это ключевое слово, предназначенное для реализации интерфейса (interface).

Оба ключевых слова extends и implements используются, когда Вы создаете свой собственный класс на языке Java. Различие между ними в том, что implements означает, что Вы используете элементы интерфейса в Вашем классе, а extends означает, что Вы создаете подкласс от класса, который расширяете (extend). В новом классе Вы можете расширить только один класс, но Вы можете реализовать столько интерфейсов, сколько захотите.

Тут появилось словечко интерфейс (interface). Разница между interface и обычным классом (regular class) — то, что в интерфейсе Вы не можете определить определенную реализацию (только ее «интерфейс»), а в классе можете. Если сказать точнее, то это означает, что в интерфейсе Вы можете только указать методы, но не реализовывать их. Только класс может реализовать (implement) интерфейс. Класс также может расширить (extend) другой класс. Аналогично, интерфейс может расширить другой интерфейс. Реализация (implements) используется для интерфейса, и расширение (extends) используется для расширения класса. Когда Вы должны выбрать между реализацией интерфейса или расширением класса, пойдите по пути реализации интерфейса, так как класс может реализовать множество интерфейсов, но расширить можно только один класс.

Java не поддерживает множественное наследование (multiple inheritance) для классов. Эта проблема также решается путем использования нескольких интерфейсов.

@Override ключевое слово, которое позволяет в дочернем классе заново создать реализацию метода родительского класса.

Пример реализации интерфейса (как используется ключевое слово implements):

//Интерфейс, здесь нет реализации методов, // только их объявления: public interface ExampleInterface  public void do(); public String doThis(int number); > 

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

//А вот это уже реализация (применение ключевого слова implements): public class sub implements ExampleInterface  public void do()  //определите то, что должно произойти . > public String doThis(int number)  //определите то, что должно произойти . > > 

Теперь пример расширения класса (применение ключевого слова extends):

//Исходный класс, который будет расширен: public class SuperClass  public int getNb()  //определите то, что должно произойти return 1; > public int getNb2()  //определите то, что должно произойти return 2; > >
//Производный класс, расширяющий исходный: public class SubClass extends SuperClass //Вы можете переназначить (override) реализацию метода: @Override public int getNb2() return 3; > >

Вот что получится в результате:

SubClass s = new SubClass(); s.getNb(); //возвращает 1 s.getNb2(); //возвращает 3
SuperClass sup = new SuperClass(); sup.getNb(); //возвращает 1 sup.getNb2(); //возвращает 2

Чтобы лучше понять работу терминов extends, implements, interface, @Override, необходимо изучить принципы объектно-ориентированного программирования: динамическое связывание (dynamic binding), полиморфизм (polymorphism) и общее наследование (general inheritance) [1].

[Ссылки]

1. Lesson: Interfaces and Inheritance site:docs.oracle.com .

extends

Ключевое слово extends используется в объявлении класса или в выражениях класса для создания дочернего класса.

Синтаксис

class ChildClass extends ParentClass

Описание

Ключевое слово extends может быть использовано для создания дочернего класса для уже существующего класса или встроенного объекта.

Свойство .prototype родительского класса или объекта должно быть Object или null .

Примеры

Использование extends

В первом примере создаётся дочерний класс с именем Square от класса с именем Polygon . Этот пример был взят из live demo (source).

class Square extends Polygon  constructor(length)  // Здесь вызывается конструктор родительского класса, // в который передаётся свойство length в качестве // аргументов, соответствующих полям width и height, // класса Polygon super(length, length); // Примечание: // В конструкторе класса, метод super() должен быть вызван // перед использованием this. В противном случае, будет // выброшена ошибка. this.name = "Square"; > get area()  return this.height * this.width; > > 

Расширение встроенных объектов с помощью extends

Этот пример расширяет встроенный объект Date . Пример взят из live demo (source).

class myDate extends Date  constructor()  super(); > getFormattedDate()  var months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]; return ( this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear() ); > > 

Расширение null

Расширение null работает как и с обычным классом, за исключением того, что прототип объекта не наследует Object.prototype (en-US).

class nullExtends extends null  constructor() > > Object.getPrototypeOf(nullExtends); // Function.prototype Object.getPrototypeOf(nullExtends.prototype); // null new nullExtends(); //ReferenceError: this is not defined 

Спецификация

Specification
ECMAScript Language Specification
# sec-class-definitions

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

Java — разница между extends и implements на примерах

После продолжительного программирования на C++ переходить на Java бывает болезненно. С одной стороны прославленный сборщик мусора, а с другой огромное множество принципиальных различий в подходах к программированию. Об одном таком отличии я сегодня расскажу подробнее.

Речь пойдет о наследовании в Java. В отличии от C++, где наследование могло быть множественным, здесь это не совсем так. Кроме того, привычный синтаксис через «:» заменился на целых два ключевых слова: extends и implements. Начну с первого.

Ключевое слово extends в Java

Действие ключевого слова в точности совпадает с его переводом, один класс расширяет другой, что является классическим наследованием. Правила видимости полей и методов сохранились: private доступны только в самом классе, protected в самом классе и во всех наследниках, к public методам и полям можно обращаться откуда угодно. Главное отличие от «сишного» наследования в том, что можно расширять только один класс. Я сейчас не буду рассуждать о том, насколько это удобно, скажу только, что со множественным наследованием в C++ постоянно творилась какая-то каша.

Небольшой пример наследования с помощью ключевого слова extends. Напишем класс Door, который будет описывать характеристики двери, мы можем создать объект этого класса и работать с ним, как с «просто дверью». С другой стороны напишем еще два класса: IronDoor и WoodDoor, которые будут расширять класс Door(== наследуются от класса Door), т.е. добавят свои характеристики к базовым.

//Базовый класс "дверь" public class Door < //Допустим, что у любой двери есть цена protected int price; //Этот метод тоже наследуется protected void doSomething() < System.out.println("Door is doing something"); >//Этот метод доступен исключительно в классе Door private void onlyForDoor() < >> //Железная дверь public class IronDoor extends Door < //Уровень защиты определен только для железных дверей private int protectionLvl; IronDoor(int price, int protectionLvl) < this.price = price; this.protectionLvl = protectionLvl; >> //Деревянная дверь public class WoodDoor extends Door < //Характеристика "порода древесины" доступна только деревянной двери private String woodType; WoodDoor(int price, String woodType) < this.price = price; this.woodType = woodType; >>

Ключевое слово implements в Java

С ключевым словом implements связано чуть больше хитростей. Слово «имплементировать» можно понимать, как «реализовывать», а в тот самый момент, когда возникает слово «реализовывать», где-то недалеко появляются интерфейсы. Так вот конструкция public class Door implements Openable означает, что класс дверь реализует интерфейс «открывающийся». Следовательно класс должен переопределить все методы интерфейса. Главная фишка в том, что можно реализовывать сколь угодно много интерфейсов.

Зачем это нужно? Самый простой пример, который приходит в голову, два интерфейса: Openable и Closeble. В первом метод open, и метод close во втором. Они помогут научить нашу дверь закрываться и открываться.

public interface Openable < void open(); >public interface Closeble < void close(); >public class Door implements Openable, Closeble < protected int price; protected void doSomething() < System.out.println("Door is doing something"); >//Реализованные методы @Override public void open() < >@Override public void close() < >>

В классах-потомках двери(железная и деревянная двери) тоже появятся методы открыть/закрыть, реализованные в классе Door. Но никто нам не запрещает их переопределить.

public class IronDoor extends Door < private int protectionLvl; IronDoor(int price, int protectionLvl) < this.price = price; this.protectionLvl = protectionLvl; >//Переопределяем методы @Override public void open() < System.out.println("The IRON door is opened"); >@Override public void close() < System.out.println("The IRON door is closed"); >>

Заключение

Итак, главное отличие в том, что extends используется для наследования от класса в прямом смысле этого слова, а implements позволяет «реализовать интерфейс». На первый взгляд это кажется лишним, неудобным и непонятным, но стоит пару раз использовать по назначению и все встает на свои места. На сегодня у меня все, спасибо за внимание!

Различия между implements и extends в Java

Основное различие между ключевыми словами implements и extends в Java заключается в том, что они используются для наследования различных типов сущностей.

Использование extends

Ключевое слово extends используется в Java для наследования класса. Это означает, что новый класс создается на основе существующего класса, унаследовав его свойства и методы.

public class Animal < public void eat() < System.out.println("Animal eats"); >> public class Dog extends Animal < public void bark() < System.out.println("Dog barks"); >>

В этом примере класс Dog расширяет класс Animal , тем самым унаследовав метод eat() от класса Animal . Теперь у экземпляра класса Dog есть доступ и к методу eat() , и к методу bark() .

Использование implements

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

interface Playable < void play(); >public class Dog implements Playable < public void play() < System.out.println("Dog plays"); >>

Здесь класс Dog реализует интерфейс Playable , обязуясь предоставить реализацию для всех методов, объявленных в интерфейсе. В данном случае, класс Dog предоставляет реализацию для метода play() .

Когда использовать что?

extends используется, когда есть четкое отношение «является» между классами. Например, «Собака» является «Животным», поэтому класс Dog может расширить класс Animal .

implements используется, когда класс должен предоставить определенное поведение, описанное в интерфейсе. Если «Собака» может «играть», то класс Dog может реализовать интерфейс Playable .

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

Вывод

Различие между implements и extends в Java довольно простое: extends используется для наследования класса, а implements — для реализации интерфейса. Отношения между классами и интерфейсами определяют, когда использовать что.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *