Java method argument extends class

Java 8 наследование

В предыдущих статьях я уже несколько раз упоминал наследование. Настало время написать подробную статью про эту вещь.

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

Класс, который наследуется от другого класса, называется подклассом (subclass), дочерним классом (child class), потомком или расширенным классом (extended class).

Класс, от которого наследуется дочерний класс, называется родительским классом (parent class), предком, суперклассом (superclass) или базовым классом (base class).

В самой вершине иерархии наследования находится класс Object , от которого наследуются все классы, для которых не указан явно суперкласс. Таким образом все классы (кроме самого Object ) напрямую или через какое-либо количество уровней наследования наследуются от класса Object .

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

java inheritance object

Дочерний класс наследует все public и protected члены своего родителя независимо от пакета, в котором расположен родительский класс. Если дочерний и родительский класс находятся в одном пакете, то дочерний класс наследует также package-private члены своего родителя.

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

Дочерний класс не наследует private члены родительского класса, однако если в родительском классе есть protected , public или package-private (для случая нахождения дочернего и родительского класса в одном пакете) методы для доступа к private полям, то они могут использоваться дочерним классом.

Приведение типов

Посмотрите на создание экземпляра объекта Goblin :

Читайте также:  What is null reference in java

Источник

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

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

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

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

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

Синтаксис

class Super < . >class Sub extends Super

Пример кода

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

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

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

class Calculator < int c; public void addition(int a, int b) < c = a + b; System.out.println("Сумма чисел: " + c); >public void subtraction(int a, int b) < c = a - b; System.out.println("Разность чисел: " + c); >> public class My_Calculator extends Calculator < public void multiplication(int a, int b) < c = a * b; System.out.println("Произведение чисел: " + c); >public static void main(String args[]) < int a = 10, b = 20; My_Calculator cal = new My_Calculator(); cal.addition(a, b); cal.subtraction(a, b); cal.multiplication(a, b); >> 

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

javac My_Calculator.java java My_Calculator 

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

Сумма чисел: 30 Разность чисел: -10 Произведение чисел: 200 

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

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

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

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

Calculator cal = new My_Calculator(); cal.addition(a, b); cal.subtraction(a, b); 

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

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

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

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

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

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

super.variable super.method(); 

Пример кода

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

Читайте также:  Python decimal целая часть

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

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

// Интерфейс class Super_class < int num = 88; // Метод display() суперкласса public void display() < System.out.println("Это метод display() суперкласса"); >> public class Sub_class extends Super_class < int num = 77; // Метод display() субкласса public void display() < System.out.println("Это метод display() подкласса"); >public void my_method() < // Инициализация подкласса Sub_class sub = new Sub_class(); // Вызываем метод display() подкласса sub.display(); // Вызываем метод display() суперкласса super.display(); // Выводим значение переменной num подкласса System.out.println("Значение переменной num в подклассе: " + sub.num); // Выводим значение переменной num суперкласса System.out.println("Значение переменной num в суперклассе: " + super.num); >public static void main(String args[]) < Sub_class obj = new Sub_class(); obj.my_method(); >> 

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

javac Sub_class java Super 

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

Это метод display() подкласса Это метод display() суперкласса Значение переменной num в подклассе: 77 Значение переменной num в суперклассе: 88 

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

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

Пример кода

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

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

class Superclass < int age; Superclass(int age) < this.age = age; >public void getAge() < System.out.println("Значение переменной age в суперклассе равно: " + age); >> public class Subclass extends Superclass < Subclass(int age) < super(age); >public static void main(String args[]) < Subclass s = new Subclass(24); s.getAge(); >> 

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

javac Subclass java Subclass 

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

Значение переменной age в суперклассе равно: 24 

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

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

public class Animal < >public class Mammal extends Animal < >public class Reptile extends Animal < >public class Dog extends Mammal

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

  • Animal является суперклассом класса Mammal.
  • Animal является суперклассом класса Reptile.
  • Mammal и Reptile являются подклассами класса Animal.
  • Dog одновременно является подклассом классов Mammal и Animal.
Читайте также:  Python объектно ориентированное программирование задачи

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

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

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

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

class Animal < >class Mammal extends Animal < >class Reptile extends Animal < >public class Dog extends Mammal < public static void main(String args[]) < Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); >> 

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

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

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

Пример

public interface Animal < >public class Mammal implements Animal < >public class Dog extends Mammal

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

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

Пример

interface Animal<> class Mammal implements Animal<> public class Dog extends Mammal < public static void main(String args[]) < Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); >> 

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

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

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

public class Vehicle<> public class Speed<> public class Van extends Vehicle

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

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

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

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

public class A < . >public class B extends A
public class A < . >public class B extends A < . >public class C extends B
public class A < . >public class B extends A < . >public class C extends A
public class A < . >public class B < . >public class C extends A, B < . >// Java не поддерживает множественное наследование 

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

public class extends Animal, Mammal<> 

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

Источник

Оцените статью