Что такое наследование java
Перейти к содержимому

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

  • автор:

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

И вдруг заказчик решает добавить цветную коробку — ColorBox и тяжелую коробку — HeavyBox . Цветная коробка будет отличаться от обычной только цветом, а тяжелая — весом. Получается, что в класс ColorBox мы должны добавить те же переменные width , height и depth , конструкторы и методы, которые существуют в классе Box . Дублирование кода в программировании не приветствуется, поэтому для таких случаев придуман такой механизм как наследование.

Используя наследование Java, можно создать класс, который определяет характеристики, общие для набора связанных элементов — Box . Затем этот общий класс может наследоваться другими, более специализированными классами ColorBox и HeavyBox , каждый из которых будет добавлять свои особые характеристики.

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

Пример наследования фото

Общая форма объявления класса, который наследуется от супер класса:

class имяПодкласса extends имяСуперКласса < // тело класса >

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

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

public class ColorBox extends Box6 < String color; public ColorBox(int width, int height, int depth, String color) < this.width = width; this.height = height; this.depth = depth; this.color = color; >public ColorBox() < >>

Один класс может содержать несколько наследников — класс HeavyBox тоже расширяет Box6 :

public class HeavyBox extends Box6 < int weight; public HeavyBox() < >public HeavyBox(int width, int height, int depth, int weight) < this.width = width; this.height = height; this.depth = depth; this.weight = weight; >>

В следующем классе создаем объекты всех трех типов и подсчитываем объем для каждой коробки.

public class DifferentBoxDemo1 < public static void main(String[] args) < Box6 box = new Box6(15, 10, 25); HeavyBox heavyBox = new HeavyBox(15, 10, 20, 5); ColorBox colorBox = new ColorBox(25, 12, 20, "красный"); System.out.println("Объём коробки: " + box.getVolume()); System.out.println("Объём коробки: " + heavyBox.getVolume() + " Вес коробки: " + heavyBox.weight); System.out.println("Объём коробки: " + colorBox.getVolume() + " Цвет коробки: " + colorBox.color); >>

2. Доступ к членам класса и наследование

Несмотря на то, что подкласс включает в себя все члены своего супер класса, он не может иметь доступ к тем членам супер класса, которые объявлены как private :

public class A

Из класса B , который является наследником класса A , невозможно напрямую обратиться к private переменной класса A . Доступ к ним можно получить через геттер методы:

public class B extends A < public int sum() < // return value1 + value2; return value1 + getValue2(); >>

3. Переменная супер класса может ссылаться на объект подкласса

Ссылочной переменной супер класса может быть присвоена ссылка на любой его подкласс.

Например, переменная heavyBox объявлена как Box , но она указывает на объект типа HeavyBox :

Box heavyBox = new HeavyBox(15, 10, 20, 5); Box colorBox = new ColorBox(25, 12, 20, "красный"); 

Обратное неверно! Нельзя написать так: HeavyBox heavyBox = new Box(15, 10, 20).

В следующем примере объявлено три переменные типа Box6 , но они указывают на разные объекты.

Для каждого объекта мы можем узнать его ширину, но при попытке обратиться к переменной color объекта redBox , возникнет ошибка компиляции. В чем причина такого поведения? Переменная color объявлена в классе ColorBox с уровнем доступа по умолчанию, класс DifferentBoxDemo2 находится в том же пакете, то есть переменная color должна быть доступна. Дело в том, что доступные члены класса определяются типом ссылочной переменной, а не типом объекта, на который она ссылается. То есть если переменная объявлена типа Box6 , нам доступны только члены объявленные в классе Box6 ( weight , height , depth ), и неважно на какой объект она ссылается. А вот для переменной blueBox мы можем узнать цвет, так как переменная объявлена как ColorBox :

public class DifferentBoxDemo2 < public static void main(String[] args) < Box6 box = new Box6(15, 10, 25); Box6 heavyBox = new HeavyBox(15, 10, 20, 5); Box6 redBox = new ColorBox(25, 12, 20, "красный"); ColorBox blueBox = new ColorBox(25, 12, 20, "голубой"); System.out.println("Ширина коробки: " + box.width); System.out.println("Ширина тяжелой коробки: " + heavyBox.width); System.out.println("Ширина красной коробки: " + redBox.width); System.out.println("Ширина голубой коробки: " + blueBox.width); System.out.println("Цвет голубой коробки: " + blueBox.color); //System.out.println("Цвет красной коробки: " + redBox.color); //System.out.println("Вес тяжелой коробки: " + heavyBox.weight); >>

4. Создание многоуровневой иерархии

Можно строить иерархии, состоящие из любого количества уровней наследования. Например, добавим класс Shipment , расширяющий HeavyBox :

Создание многоуровневой иерархии фото

public class Shipment extends HeavyBox1 < public double cost; public Shipment(int width, int height, int depth, int weight, double cost) < super(width, height, depth, weight); this.cost = cost; >public Shipment(double cost) < this.cost = cost; >>

Класс Shipment содержит не только переменную cost , объявленную в самом классе, но и переменные класса HeavyBox и Box6 :

public class DemoShipment < public static void main(String[] args) < Shipment shipment = new Shipment(2, 3, 4, 5, 5.3); System.out.println(shipment.cost); System.out.println(shipment.depth); System.out.println(shipment.height); System.out.println(shipment.weight); System.out.println(shipment.width); >>

5. Порядок вызова конструкторов в многоуровневой иерархии

В иерархии классов конструкторы выполняются в порядке наследования, начиная с супер класса и кончая подклассом. Рассмотрим следующую иерархию классов:

public class E < public E() < System.out.println("В конструкторе E"); >>
public class F extends E < public F() < System.out.println("В конструкторе F"); >>
public class G extends F < public G() < System.out.println("В конструкторе G"); >>

При создании объекта класса G , сначала закончит свое выполнение конструктор класса E , потом F и в конце G :

public class CallingConstructors < public static void main(String[] args) < G g = new G(); >>

Результат выполнения кода:

В конструкторе E В конструкторе F В конструкторе G
  • Процедурное и объектно-ориентированное программирование
  • Принципы ООП
  • Классы и объекты
  • Конструктор
  • Ключевое слово this
  • Перегрузка
  • Стек и куча
  • Передача объектов в методы
  • Java varargs
  • Рекурсия
  • Сборщик мусора и метод finalize
  • Ключевое слово super
  • Модификаторы доступа
  • Геттеры и сеттеры
  • Переопределение методов
  • Абстрактные классы и методы
  • Ключевое слово final
  • Задания

Урок 9. Основы языка JAVA. Наследование в java

Наследование в Java позволяет повторно использовать код одного класса в другом классе, то есть вы можете унаследовать новый класс от уже существующего класса. Главный наследуемый класс в Java называют родительским классам, или суперклассом. Наследующий класс называют дочерним классом, или подклассом. Подкласс наследует все поля и свойства суперкласса, а также может иметь свои поля и свойства, отсутствующие в классе-родителе.

Пример наследования

Рассмотрим класс под названием Shape (Форма). Shape является базовым классом, от которого наследуются другие формы, таких как прямоугольник, квадрат, круг и т.д.

public class Shape < public double area () < return 0; >>

Поскольку это просто общая «форма», метод вычисления площади area() будет возвращать ноль.
Чтобы узнать площадь конкретной фигуры, нужно создать подкласс, унаследованный от класса Shape, и в нем переопределить метод area() .

От класса Shape наследуется класс Circle, который тоже представляет собой форму.

class Circle extends Shape < // ключевое слово "extends" означает наследование private static final double PI = Math.PI; // константа private double diameter; //любое число, представляющее диаметр этого круга public Circle(double diameter) < // конструктор this.diameter = diameter; >public double area() < double radius = diameter / 2.0; return PI * radius * radius; >>

Метод area() базового класса наследуется классом Circle и становится доступен в нем, но нам нужно переопределить метод area() в классе Circle, таким образом, чтобы он вычислял площадь круга.

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

Создадим класс Main, и в нем напишем метод, который вычисляет большую площадь двух фигур:

public class Main < public static void main(String[] args) < Shape s1 = new Circle (5.0); Shape s2 = new Rectangle (5.0, 4.0); Shape larger = getLargerShape(s1,s2); System.out.println("The area of the larger shape is: "+larger.area()); >public static Shape getLargerShape(Shape s1, Shape s2) < if(s1.area() >s2.area()) return s1; else return s2; > >

Как вы можете видеть, метод getLargerShape() не требует указания определенного типа фигуры для его двух параметров. В качестве параметров для этого метода можно использовать экземпляр любого класса, который наследует тип Shape. Можно использовать экземпляр класса круг, прямоугольник, треугольник, трапеция, и т.д. – до тех пор, как они наследуют класс формы.

Резюме:

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

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

Упражнение:

Создайте недостающий класс Rectangle, который наследует класс Shape и находит площадь.

Дополнительное чтение:

23. Java – Наследование классов, интерфейсов, методов и конструкторов с помощью ключевых слов super, extends, instanceof и отношений IS-A и HAS-A

Наследование – это процесс перенимания классом свойств (методов и полей) другого класса. С использованием в 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, копия содержимого суперкласса создаётся в нём же. Поэтому, используя объект подкласса, Вы можете получить доступ к членам суперкласса.

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

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

Обращаясь к программе выше, Вы можете создать экземпляр класса, как в примере ниже. Но, используя ссылочную переменную суперкласса, Вы не можете вызвать метод 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.

В предложенной программе у вас есть два класса с именами 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, как показано ниже.

super(values); 

Пример кода

В предложенной программе демонстрируется использование в 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.

Теперь, используя отношение 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); >> 

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

true true true 

Так как у нас есть хорошее понимание принципа работы ключевого слова 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); >> 

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

true true true 

Отношение 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 избавиться от невозможности множественного наследования.

Оглавление

  • 1. Java – Самоучитель для начинающих
  • 2. Java – Обзор языка
  • 3. Java – Установка и настройка
  • 4. Java – Синтаксис
  • 5. Java – Классы и объекты
  • 6. Java – Конструкторы
  • 7. Java – Типы данных и литералы
  • 8. Java – Типы переменных
  • 9. Java – Модификаторы
  • 10. Java – Операторы
  • 11. Java – Циклы и операторы цикла
  • 11.1. Java – Цикл while
  • 11.2. Java – Цикл for
  • 11.3. Java – Улучшенный цикл for
  • 11.4. Java – Цикл do..while
  • 11.5. Java – Оператор break
  • 11.6. Java – Оператор continue
  • 12. Java – Операторы принятия решений
  • 12.1. Java – Оператор if
  • 12.2. Java – Оператор if..else
  • 12.3. Java – Вложенный оператор if
  • 12.4. Java – Оператор switch..case
  • 12.5. Java – Условный оператор (? 🙂
  • 13. Java – Числа
  • 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
  • 13.2. Java – Метод compareTo()
  • 13.3. Java – Метод equals()
  • 13.4. Java – Метод valueOf()
  • 13.5. Java – Метод toString()
  • 13.6. Java – Метод parseInt()
  • 13.7. Java – Метод Math.abs()
  • 13.8. Java – Метод Math.ceil()
  • 13.9. Java – Метод Math.floor()
  • 13.10. Java – Метод Math.rint()
  • 13.11. Java – Метод Math.round()
  • 13.12. Java – Метод Math.min()
  • 13.13. Java – Метод Math.max()
  • 13.14. Java – Метод Math.exp()
  • 13.15. Java – Метод Math.log()
  • 13.16. Java – Метод Math.pow()
  • 13.17. Java – Метод Math.sqrt()
  • 13.18. Java – Метод Math.sin()
  • 13.19. Java – Метод Math.cos()
  • 13.20. Java – Метод Math.tan()
  • 13.21. Java – Метод Math.asin()
  • 13.22. Java – Метод Math.acos()
  • 13.23. Java – Метод Math.atan()
  • 13.24. Java – Метод Math.atan2()
  • 13.25. Java – Метод Math.toDegrees()
  • 13.26. Java – Метод Math.toRadians()
  • 13.27. Java – Метод Math.random()
  • 14. Java – Символы
  • 14.1. Java – Метод Character.isLetter()
  • 14.2. Java – Метод Character.isDigit()
  • 14.3. Java – Метод Character.isWhitespace()
  • 14.4. Java – Метод Character.isUpperCase()
  • 14.5. Java – Метод Character.isLowerCase()
  • 14.6. Java – Метод Character.toUpperCase()
  • 14.7. Java – Метод Character.toLowerCase()
  • 14.8. Java – Метод Character.toString()
  • 15. Java – Строки
  • 15.1. Java – Метод charAt()
  • 15.2. Java – Метод compareTo()
  • 15.3. Java – Метод compareToIgnoreCase()
  • 15.4. Java – Метод concat()
  • 15.5. Java – Метод contentEquals()
  • 15.6. Java – Метод copyValueOf()
  • 15.7. Java – Метод endsWith()
  • 15.8. Java – Метод equals()
  • 15.9. Java – Метод equalsIgnoreCase()
  • 15.10. Java – Метод getBytes()
  • 15.11. Java – Метод getChars()
  • 15.12. Java – Метод hashCode()
  • 15.13. Java – Метод indexOf()
  • 15.14. Java – Метод intern()
  • 15.15. Java – Метод lastIndexOf()
  • 15.16. Java – Метод length()
  • 15.17. Java – Метод matches()
  • 15.18. Java – Метод regionMatches()
  • 15.19. Java – Метод replace()
  • 15.20. Java – Метод replaceAll()
  • 15.21. Java – Метод replaceFirst()
  • 15.22. Java – Метод split()
  • 15.23. Java – Метод startsWith()
  • 15.24. Java – Метод subSequence()
  • 15.25. Java – Метод substring()
  • 15.26. Java – Метод toCharArray()
  • 15.27. Java – Метод toLowerCase()
  • 15.28. Java – Метод toString()
  • 15.29. Java – Метод toUpperCase()
  • 15.30. Java – Метод trim()
  • 15.31. Java – Метод valueOf()
  • 15.32. Java – Классы StringBuilder и StringBuffer
  • 15.32.1. Java – Метод append()
  • 15.32.2. Java – Метод reverse()
  • 15.32.3. Java – Метод delete()
  • 15.32.4. Java – Метод insert()
  • 15.32.5. Java – Метод replace()
  • 16. Java – Массивы
  • 17. Java – Дата и время
  • 18. Java – Регулярные выражения
  • 19. Java – Методы
  • 20. Java – Потоки ввода/вывода, файлы и каталоги
  • 20.1. Java – Класс ByteArrayInputStream
  • 20.2. Java – Класс DataInputStream
  • 20.3. Java – Класс ByteArrayOutputStream
  • 20.4. Java – Класс DataOutputStream
  • 20.5. Java – Класс File
  • 20.6. Java – Класс FileReader
  • 20.7. Java – Класс FileWriter
  • 21. Java – Исключения
  • 21.1. Java – Встроенные исключения
  • 22. Java – Вложенные и внутренние классы
  • 23. Java – Наследование
  • 24. Java – Переопределение
  • 25. Java – Полиморфизм
  • 26. Java – Абстракция
  • 27. Java – Инкапсуляция
  • 28. Java – Интерфейсы
  • 29. Java – Пакеты
  • 30. Java – Структуры данных
  • 30.1. Java – Интерфейс Enumeration
  • 30.2. Java – Класс BitSet
  • 30.3. Java – Класс Vector
  • 30.4. Java – Класс Stack
  • 30.5. Java – Класс Dictionary
  • 30.6. Java – Класс Hashtable
  • 30.7. Java – Класс Properties
  • 31. Java – Коллекции
  • 31.1. Java – Интерфейс Collection
  • 31.2. Java – Интерфейс List
  • 31.3. Java – Интерфейс Set
  • 31.4. Java – Интерфейс SortedSet
  • 31.5. Java – Интерфейс Map
  • 31.6. Java – Интерфейс Map.Entry
  • 31.7. Java – Интерфейс SortedMap
  • 31.8. Java – Класс LinkedList
  • 31.9. Java – Класс ArrayList
  • 31.10. Java – Класс HashSet
  • 31.11. Java – Класс LinkedHashSet
  • 31.12. Java – Класс TreeSet
  • 31.13. Java – Класс HashMap
  • 31.14. Java – Класс TreeMap
  • 31.15. Java – Класс WeakHashMap
  • 31.16. Java – Класс LinkedHashMap
  • 31.17. Java – Класс IdentityHashMap
  • 31.18. Java – Алгоритмы Collection
  • 31.19. Java – Iterator и ListIterator
  • 31.20. Java – Comparator
  • 32. Java – Дженерики
  • 33. Java – Сериализация
  • 34. Java – Сеть
  • 34.1. Java – Обработка URL
  • 35. Java – Отправка Email
  • 36. Java – Многопоточность
  • 36.1. Java – Синхронизация потоков
  • 36.2. Java – Межпоточная связь
  • 36.3. Java – Взаимная блокировка потоков
  • 36.4. Java – Управление потоками
  • 37. Java – Основы работы с апплетами
  • 38. Java – Javadoc

#14 – Наследование в классах

#14 – Наследование в классах

Помимо классов и объектов, ООП содержит дополнительные три основные концепции: наследование, инкапсуляция и полиморфизм. Ранее мы уже знакомились с инкапсуляцией (закрытием данных) и теперь настал черед изучить наследование.

Видеоурок

Наследование является одним из ключевых понятий ООП. За счёт наследования можно создать один общий класс (класс родитель) и создать множество других классов (классы наследники), что будут наследовать все поля, методы и конструкторы из главного класса.

За чем использовать наследование?

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

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

На основе класса мы спокойно можем создать объект легковой машины, объект грузовика, объект самолета и так далее. У всех объектов будут одинаковые характеристики и методы.

Мы явно понимаем, что у объекта машина и самолёт будут разные поля и характеристики. Как можно поступить:

  1. Можно создать два отдельных класса: «Car» и «Airplane». В каждом классе будут все методы, поля и конструкторы повторно переписанные из класса «Транспорт», а также будут новые методы, что важны только для конкретного класса;
  2. Можно создать два класса наследника: «Car» и «Airplane». Оба класса будут наследовать всё от класса «Транспорт» и при этом будут содержать свои дополнительные функции. Таким образом повторения кода не будет и код станет меньше и чище.
Создание классов наследников

Для создания класса наследника требуется создать класс и указать наследование от главного класса.

Пример класса наследника:

// Обычный класс class Transport < protected float speed; >// Также обычный класс, но наследует данные от класса Transport class Auto extends Transport < private String model; Auto (float speed, String model) < this.speed = speed; this.model = model; System.out.println("Скорость: " + speed + ", модель - " + model); >> public class Main < public static void main(String[] args) < // Можем ссылаться не только на данные из класса Auto, // но также на данные из класса Transport Auto bmw = new Auto(250.5f, "X3M"); Auto mercedes = new Auto(270f, "C63 AMG"); >>

Как вы можете заметить, у нас есть одна общая переменная speed. Поскольку модификатор доступа у неё protected, то доступ к переменной мы имеем внутри класса Transport, а также внутри всех классов наследников.

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

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

Весь код будет доступен после подписки на проект!

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

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