Что такое наследование java

Что такое наследование java

Наследование — это процесс перенимания классом свойств (методов и полей) другого класса. С использованием в Java наследования информация становится управляемой в иерархическом порядке.

Класс, который наследует свойства другого класса, называется подклассом (производным классом, наследующим классом), а класс, свойства которого наследуются, известен как суперкласс (базовый класс, родительский класс)

Содержание

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

extends — это кодовое слово, используемое для наследования свойств класса. Взглянем на синтаксис этого ключевого слова.

Синтаксис

Пример кода

Дальше приведён пример процесса наследования на Java. На этом примере Вы можете рассмотреть два класса с именами Calculator и My_Calculator.

Используя ключевое слово extends в Java, My_Calculator перенимает методы addition() и subtraction() класса Calculator.

Скопируйте и вставьте эту программу в файле под именем My_Calculator.java

Скомпилируйте и выполните вышеприведённый код, как показано ниже.

После запуска программы получим следующий результат:

В данной программе, при создании объекта классу My_Calculator, копия содержимого суперкласса создаётся в нём же. Поэтому, используя объект подкласса, Вы можете получить доступ к членам суперкласса.

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

Обращаясь к программе выше, Вы можете создать экземпляр класса, как в примере ниже. Но, используя ссылочную переменную суперкласса, Вы не можете вызвать метод multiplication(), который принадлежит подклассу My_Calculator.

Примечание: подкласс наследует все члены (поля, методы, вложенные классы) из суперкласса. в Java конструкторы не являются членами, поэтому они не наследуются подклассом, но конструктор суперкласса может быть вызван из подкласса.

Ключевое слово super

Ключевое слово super схоже с ключевым словом this. Ниже приведены случаи, где используется super в Java.

  • Для дифференциации членов суперкласса от членов подкласса, если у них есть одинаковые имена.
  • Для вызова конструктора суперкласса из подкласса.

Дифференциация членов

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

Пример кода

Этот раздел содержит программу, которая демонстрирует использование ключевого слова super в Java.

В предложенной программе у вас есть два класса с именами Sub_class и Super_class, оба имеющие метод display() с разными реализациями и переменную с именем num с разными значениями. Вы можете увидеть, что мы использовали ключевое слово super для дифференциации членов суперкласса из подкласса.

Скопируйте и вставьте эту программу в файле под именем Sub_class.java.

Скомпилируйте и выполните вышеприведённый код, как показано ниже.

После запуска программы будет получен следующий результат:

Вызов конструктора суперкласса

Если класс перенимает свойства другого класса, подкласс автоматически получается стандартный конструктор суперкласса. Но если Вы хотите вызвать параметризованный конструктор суперкласса, Вам нужно использовать ключевое слово super, как показано ниже.

Пример кода

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

Скопируйте и вставьте эту программу в файле под именем Subclass.java

Скомпилируйте и выполните вышеприведённый код, как показано ниже.

После запуска программы будет выдан результат:

Отношение IS-A

IS-A — это способ сказать «Этот объект является типом этого объекта». Давайте посмотрим, как ключевое слово extends используется для достижения наследования.

Теперь, основываясь на примере выше, в объектно-ориентированных терминах, следующие утверждения верны

  • Animal является суперклассом класса Mammal.
  • Animal является суперклассом класса Reptile.
  • Mammal и Reptile являются подклассами класса Animal.
  • Dog одновременно является подклассом классов Mammal и Animal.

Теперь, используя отношение IS-A, мы можем сказать так:

  • Mammal IS-A Animal.
  • Reptile IS-A Animal.
  • Dog IS-A Mammal. Таким образом, Dog IS-A тоже Animal.

С использованием ключевого слова extend, подклассы могут наследовать все свойства суперкласса кроме его приватных свойств (private).

Читайте также:  Определение связи многие ко многим

Мы можем убедиться, что Mammal на самом деле Animal с использованием оператора экземпляра.

Мы получим следующий результат:

Так как у нас есть хорошее понимание принципа работы ключевого слова extends, давайте рассмотрим, как используется ключевое слово implements для получения отношения IS-A.

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

Пример

Ключевое Слово instanceof

Давайте использует оператор instanceof в Java с целью проверки, являются ли Mammal и Dog на самом деле Animal.

Пример

Мы получим следующий результат:

Отношение HAS-A

Эти отношения в основном основаны на обращении. Они определяют, является ли определенный класс HAS-A определенным случаем. Эта взаимосвязь помогает уменьшить дублирование кода, а также баги. Взглянем на пример.

Мы видим, что у класса Van HAS-A (есть) Speed. Имея отдельный класс Speed, нам не нужно вставлять код, принадлежащий Speed в класс Van, что позволяет нам использовать класс Speed в нескольких приложениях.

В особенности объектно-ориентированного программирования, пользователям не нужно волноваться о том, какой объект выполняет текущую работу. Для достижения этого, класс Van скрывает детали реализации от пользователей класса Van. Таким образом, пользователи, должны попросить класс Van выполнить определенное действие, и класс Van либо выполнит работу сам по себе, либо попросит другой класс выполнить действие.

Виды наследования

Есть различные способы наследования, как показано ниже.

Вид Схема Пример
Одиночное наследование
Многоуровневое наследование
Иерархическое наследование
Множественное наследование

Очень важно запомнить, что Java не поддерживает множественное наследование. Это значит, что класс не может продлить более одного класса. Значит, следующее утверждение НЕВЕРНО:

Тем не менее, класс может реализовать один или несколько интерфейсов, что и помогло Java избавиться от невозможности множественного наследования.

В случае наследования в Java для указания родительского класса используется ключевое слово extends, которое следует после имени дочернего, т. е. производного, класса. После extends пишется родительский класс. Другими словами, "дочерний класс расширяет родительский".

В Java нет множественного наследования от классов, но есть множественное наследование интерфейсов.

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

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

В приведенном выше примере ошибка возникает на уровне конструктора класса Child. Перед тем как выполнится выражение this.b = b, будет неявно вызван конструктор Parent без параметров. Однако такого конструктора в родительском классе нет.

Если мы закомментируем или удалим конструктор Parent,

то ошибка в дочернем классе исчезнет. Дело в том, что в Java любой класс есть потомок базового класса Object, у которого всегда имеется пустой дефолтный конструктор. В данном случае, двигаясь по дереву наследования к корню, из Child будет вызываться конструктор базового для всех класса.

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

Заметим, что у объектов Child поле this.a существует, даже если ему не было присвоено значение. В данном случае значение будет нулевым.

Обычным вариантом недопущения подобных ошибок является объявление в Parent конструктора без аргументов. Он может быть пустым, или содержать какой-либо код:

Другой распространенный вариант – когда в дочернем классе явно вызывается конструктор родительского класса с помощью ключевого слова super. Причем вызывать всегда надо первой строчкой тела конструктора.

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

Читайте также:  Изменился шрифт в гугл хром

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

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

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

Наследование является важной опорой ООП (объектно-ориентированного программирования). Это механизм в Java, с помощью которого один класс позволяет наследовать свойства (поля и методы) другого класса.
Важная терминология:

  • Суперкласс: класс, свойства которого наследуются, называется суперклассом (или базовым классом, или родительским классом).
  • Подкласс: Класс, который наследует другой класс, известен как подкласс (или производный класс, расширенный класс или дочерний класс). Подкласс может добавлять свои собственные поля и методы в дополнение к полям и методам суперкласса.
  • Возможность повторного использования: Наследование поддерживает концепцию «повторного использования», т.е. когда мы хотим создать новый класс и уже существует класс, который включает в себя часть кода, который мы хотим, мы можем получить наш новый класс из существующего класса. Делая это, мы повторно используем поля и методы существующего класса.

Как использовать наследование в Java

Ключевое слово, используемое для наследования, расширяет .
Синтаксис:

Пример: В приведенном ниже примере наследования класс Bicycle является базовым классом, класс MountainBike является производным классом, который расширяет класс Bicycle, а класс Test является классом драйвера для запуска программы.

// Java-программа для иллюстрации
// понятие наследования

// класс Bicycle имеет два поля

public int gear;

public int speed;

// класс Bicycle имеет один конструктор

public Bicycle( int gear, int speed)

this .gear = gear;

this .speed = speed;

// класс Bicycle имеет три метода

public void applyBrake( int decrement)

public void speedUp( int increment)

// метод toString () для печати информации о Bicycle

public String toString()

return ( "No of gears are " +gear

+ "speed of bicycle is " +speed);

class MountainBike extends Bicycle

// подкласс MountainBike добавляет еще одно поле

public int seatHeight;

// подкласс MountainBike имеет один конструктор

public MountainBike( int gear, int speed,

// вызов конструктора базового класса (Bicycle)

super (gear, speed);

// подкласс MountainBike добавляет еще один метод

public void setHeight( int newValue)

// переопределение метода toString ()

// Велосипеда, чтобы напечатать больше информации

public String toString()

return ( super .toString()+

"
seat height is " +seatHeight);

public class Test

public static void main(String args[])

MountainBike mb = new MountainBike( 3 , 100 , 25 );

В приведенной выше программе при создании объекта класса MountainBike копия всех методов и полей суперкласса получает память в этом объекте. Вот почему, используя объект подкласса, мы также можем получить доступ к членам суперкласса.
Обратите внимание, что во время наследования создается только объект подкласса, а не суперкласс. Для получения дополнительной информации см. Создание объекта Java наследуемого класса .
Иллюстративное изображение программы:

На практике наследование и полиморфизм используются вместе в Java для достижения быстрой производительности и читабельности кода.

Типы наследования в Java

Ниже приведены различные типы наследования, которые поддерживаются Java.

    Одиночное наследование. При одиночном наследовании подклассы наследуют свойства одного суперкласса. На изображении ниже класс A служит базовым классом для производного класса B.

// Java-программа для иллюстрации
// понятие одиночного наследования

public void print_geek()

class two extends one

public void print_for()

public class Main

public static void main(String[] args)

Многоуровневое наследование. В многоуровневом наследовании производный класс будет наследовать базовый класс, а также производный класс также будет выступать в качестве базового класса для другого класса. На изображении ниже класс A служит базовым классом для производного класса B, который, в свою очередь, служит базовым классом для производного класса C. В Java класс не может напрямую обращаться к членам дедушки и бабушки .

Читайте также:  Как сделать скриншот видео на телефоне самсунг

// Java-программа для иллюстрации
// концепция многоуровневого наследования

public void print_geek()

class two extends one

public void print_for()

class three extends two

public void print_geek()

public class Main

public static void main(String[] args)

three g = new three();

Иерархическое наследование. В иерархическом наследовании один класс служит суперклассом (базовым классом) для более чем одного подкласса. На рисунке ниже класс A служит базовым классом для производного класса B, C и D.

// Java-программа для иллюстрации
// понятие иерархического наследования

public void print_geek()

class two extends one

public void print_for()

class three extends one

public class Main

public static void main(String[] args)

three g = new three();

Множественное наследование (через интерфейсы). В множественном наследовании один класс может иметь более одного суперкласса и наследовать функции от всех родительских классов. Обратите внимание, что Java не поддерживает множественное наследование с классами. В Java, мы можем достичь множественного наследования только через интерфейсы . На изображении ниже класс C получен из интерфейса A и B.

// Java-программа для иллюстрации
// концепция множественного наследования

public void print_geek();

public void print_for();

interface three extends one,two

public void print_geek();

class child implements three

public void print_geek() <

public void print_for()

public class Main

public static void main(String[] args)

child c = new child();

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

Важные факты о наследовании в Java

  • Суперкласс по умолчанию : за исключением класса Object , который не имеет суперкласса, каждый класс имеет один и только один прямой суперкласс (одиночное наследование). В отсутствие какого-либо другого явного суперкласса каждый класс неявно является подклассом класса Object .
  • Суперкласс может быть только один: суперкласс может иметь любое количество подклассов. Но подкласс может иметь только один суперкласс. Это потому, что Java не поддерживает множественное наследование с классами. Хотя с интерфейсами, множественное наследование поддерживается Java.
  • Наследование конструкторов. Подкласс наследует все члены (поля, методы и вложенные классы) от своего суперкласса. Конструкторы не являются членами, поэтому они не наследуются подклассами, но конструктор суперкласса может быть вызван из подкласса.
  • Наследование закрытых членов : подкласс не наследует закрытых членов своего родительского класса. Однако, если у суперкласса есть открытые или защищенные методы (такие как методы получения и установки) для доступа к его частным полям, они также могут использоваться подклассом.

Что все можно сделать в подклассе?

В подклассах мы можем наследовать члены как есть, заменять их, скрывать или дополнять их новыми членами:

  • Унаследованные поля можно использовать напрямую, как и любые другие поля.
  • Мы можем объявить новые поля в подклассе, которых нет в суперклассе.
  • Унаследованные методы могут использоваться непосредственно как они есть.
  • Мы можем написать новый метод экземпляра в подклассе, который имеет ту же сигнатуру, что и сигнатура в суперклассе, переопределяя его (как в примере выше, метод toString () переопределяется).
  • Мы можем написать новый статический метод в подклассе, который имеет ту же сигнатуру, что и в суперклассе, тем самым скрывая его.
  • Мы можем объявить новые методы в подклассе, которых нет в суперклассе.
  • Мы можем написать конструктор подкласса, который вызывает конструктор суперкласса либо неявно, либо с помощью ключевого слова super .

Эта статья предоставлена Гауравом Миглани . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Ссылка на основную публикацию
Что такое vpn на планшете
Каждый из пользователей интернета хоть раз да слышал о VPN, но мало кто задумывался о его необходимости и роли для...
Что за сайт mirror bullshit agency
MIRROR.BULLSHIT.AGENCY Название сайта: Поиск по объявлениям на Авите Описание: Поиск по объявлениям на Авите Поиск объявлений по номеру Номер: Искать...
Что за формат webrip
Классификация видео для пользователей дело обычное. У всех на слуху HD, 720p и прочие. Но вот про «рипы» мало кто...
Что такое ussd сообщение
Содержание статьи Что такое ussd запрос Как отключить GPRS-интернет Какие есть USSD-коды и полезные номера у Мегафона USSD является сокращением...
Adblock detector