Сегодняшняя статья будет посвящена пониманию некоторых ключевых концепций программирования на Java. Это: наследование, включающее полиморфизм, интерфейс и абстрактный класс. Знание того, как и когда использовать эти концепции, - вот что отличает лучших программистов от хороших программистов. Итак, приступим!

1. Интерфейсы

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

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

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

Интерфейсы используются для абстракции. Поскольку методы в интерфейсах не имеют тела, они должны быть реализованы классом, прежде чем вы сможете получить к ним доступ. Класс, реализующий интерфейс, должен реализовывать все методы этого интерфейса. Чтобы реализовать вышеуказанный интерфейс, мы можем иметь:

Еще одно замечание: класс, реализующий интерфейс, должен реализовывать все методы, объявленные в интерфейсе. Методы должны иметь ту же сигнатуру (имя + параметры), что и объявленные в интерфейсе. Классу не нужно реализовывать (объявлять) переменные интерфейса. Только методы.

Класс Java также может реализовывать несколько интерфейсов Java. В этом случае класс должен реализовать все методы, объявленные во всех реализованных интерфейсах. Примером может служить следующий класс, реализующий два интерфейса.

Кроме того, интерфейс java может наследовать от другого интерфейса java, точно так же, как классы могут наследовать от других классов. Вы указываете наследование с помощью ключевого слова extends. О наследовании будет сказано ниже. Но в отличие от классов интерфейсы могут наследовать от нескольких интерфейсов. Это делается путем перечисления имен всех интерфейсов, от которых требуется наследование, через запятую. Класс, реализующий интерфейс, который наследуется от нескольких интерфейсов, должен реализовывать все методы интерфейса и его родительских интерфейсов. Пример приведен ниже.

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

2. Наследование

Наследование - это процесс, при котором характеристики наследуются от предков. Наследование в java можно определить как механизм, в котором новый класс является производным от существующего класса. Классы могут наследовать или приобретать свойства и методы других классов, точно так же, как сын может приобретать некоторые черты и поведение от своего отца.

Например, млекопитающие - это суперкласс, а люди и животные - подклассы. Животные наследуют все свойства млекопитающих. Впоследствии собаки могут унаследовать все свойства животных, что делает их подклассом животных. Механизм наследования очень полезен при повторном использовании кода. Классы могут быть производными от классов, производных от классов, производных от классов, и так далее. В java по умолчанию родительским классом является класс Object.

В Java наследование объявляется с помощью ключевого слова extends. Вы объявляете, что один класс расширяет другой класс, используя ключевое слово extends в определении класса. Вот пример наследования Java с использованием ключевого слова extends:

В java можно ссылаться на подкласс как на экземпляр одного из его суперклассов. Например, используя определения классов из приведенного выше примера, можно ссылаться на экземпляр класса Car как на экземпляр класса Vehicle. Поскольку класс Car наследуется от класса Vehicle, он также считается a Vehicl e.

Сначала создается экземпляр Car. Во-вторых, экземпляр Car назначается переменной типа Vehicle. Теперь переменная Vehicle (ссылка) указывает на экземпляр Car. Это возможно, потому что класс Ca r наследуется от класса Vehicle.

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

С другой стороны, механизм наследования Java не включает конструкторы. Другими словами, конструкторы суперкласса не наследуются подклассами. Подклассы по-прежнему могут вызывать конструкторы суперкласса с помощью конструкции super (). Фактически, конструктор подкласса требуется для вызова одного из конструкторов суперкласса в качестве самого первого действия внутри тела конструктора.

Другие ограничения наследования классов Java состоят в том, что подкласс не может наследовать частные члены своего суперкласса. Блоки конструктора и инициализатора не могут быть унаследованы подклассом. Кроме того, у подкласса может быть только один суперкласс.

3. Полиморфизм

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

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

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

4. Абстрактные классы

Абстрактный класс Java - это класс, экземпляр которого невозможно создать. Это в основном означает, что вы не можете создавать новые экземпляры абстрактного класса. Цель абстрактного класса - функционировать в качестве основы для подклассов. В java вы объявляете, что класс является абстрактным, добавляя ключевое слово abstract в объявление класса.

У абстрактного класса могут быть абстрактные методы. Вы объявляете абстрактный метод, добавляя ключевое слово abstract перед объявлением метода, как показано выше. Обратите внимание, что абстрактный метод не имеет реализации. У него просто есть подпись метода. Кроме того, если у класса есть абстрактный метод, весь класс должен быть объявлен абстрактным. Не все методы абстрактного класса должны быть абстрактными методами. В абстрактном классе могут быть как абстрактные, так и не абстрактные методы.

Подклассы абстрактного класса должны реализовывать (переопределять) все абстрактные методы его абстрактного суперкласса. Неабстрактные методы суперкласса просто наследуются. При необходимости их также можно переопределить. Вот пример подкласса абстрактного класса MyAddition.

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

Таким образом, цель абстрактных классов - функционировать как базовые классы, которые могут быть расширены подклассами для создания полной реализации. Может возникнуть вопрос: «В чем разница между интерфейсом и абстрактным классом?» Ответ прост. Интерфейсы Java используются для того, чтобы классы, использующие интерфейс, не зависели от классов, реализующих интерфейс. Таким образом, вы можете обмениваться реализацией интерфейса, не изменяя класс с помощью интерфейса. С другой стороны, абстрактные классы обычно используются как базовые классы для расширения по подклассам.