Постановка задачи
Целью данной работы является демонстрация всех возможностей языка Java при реализации основных китов ООП (наследование, полиморфизми инкапсуляция). В данном случае речь пойдет о первом из них -наследование. Для того, что бы не возниколо трудностей, при рассмотрении реализации наследования в Java на конкретном примере, определим некоторые теоритические аспекты данной темы.
Немного теории
Итак, дадим определение нескольким терминам, которые Вам прийдется не раз услышать.
Сначала я хочу разграничить два понятия – объект и класс. Эти понятия постоянно путают. Между тем, они являются центральными в ООП. И знать различия между ними, на мой взгляд, необходимо.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки.
Давайте так же выясним, что подразумевает под сабой наследование.Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование позволяет поддерживать концепцию иерархии классов. Применение иерархии классов делает управляемыми большие потоки информации. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы полностью его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным.
Теперь поговорим о таком важном понятии, как модификаторы доступа. Модификаторы доступа можно рассматривать как с позиции инкапсуляции так и наследования. Если рассматривать с позиции наследования, то модификаторы доступа позволяют путем установки доступа указать члены класса, которые будут наследоваться классом наследником автоматически, а какие нет. Например, переменная или метод, объявленная как public в данном классе будет автоматически перениматься в классе потомке. Существует 3 модификатора доступа: public (без ограничений), private(область доступа только из данного класса) и protected(область доступа из данного класса и его потомков).
На наследование накладывается ряд таких ограничений как: в Javaзапрещено множественное наследование, при наследование если класс-родитель имеет одинаковые по названию поля или методы с классом-потомком, то происходит сокрытие имен. Для переопредееления метода из базового класса в классе-потомке существует служебное слово Override. Если нужно запретить переопределение (overriding) метода во всех порожденных классах, то этот метод можно описать как final. Кроме того, ключевое словоfinal может применяться к классам. Это означает, что данный класс не может быть унаследован другим классом.
Особенности реализации наследования в Java
Для демонстрации работы реализации наследования в Java я написал демонстрационное консольное приложение, в котором я реализовал три класса. Первый из них является главным классом приложения, в нем реализован метод Main, который является точкой входа в программу, а так же в нем создаются объекты двух других классов. Второй класс, класс А, содержит три поля с разным уровнем доступа (демонстрация использования модификаторов доступа), два конструктора и два метода, один из которых является переопределенным. Данный класс генерирует в конструкторе три случайных числа и при вызове метода toString() возвращает их.
Существует так же третий класс, класс В, который является потомком класса А. В нем реализован собственный конструктор, который вычисляет сумму трёх случайных чисел, которые генерируются в классе А.
В главном классе продемонстрированы разные способы создания объектов этого класса, а так же продемонстрирован порядок вызова их конструкторов. Ниже Вы можете ознакомится с исходным кодом этих классов.
Исходный код класса А:
import java.util.Random; public class A { private int a; protected int b; public int c; private Random rand; public A(int bound) { rand = new Random(); a = rand.nextInt(bound); b = rand.nextInt(bound); c = rand.nextInt(bound); System.out.println("Call the constructor #2 of the class A"); } public A() { rand = new Random(); a = rand.nextInt(); b = rand.nextInt(); c = rand.nextInt(); System.out.println("Call the constructor #1 of the class A"); } @Override public String toString() { return "a = " + a + " b = " + b + " c = " + c; } protected int getValueA() { return a; } }
Исходный код класса В:
public class B extends A { private int sum; public B() { sum = this.b + this.c + this.getValueA(); System.out.println("Call the constructor of the class B"); } @Override public String toString() { super.toString(); return "This method belongs to the class B!"; } public int getSum() { return sum; } }
Исходный код главного класса:
public class Main { public static void main(String[] args) { System.out.println("Creating object of class A with using his constructor!"); A ob1 = new A(10); System.out.println(); System.out.println("Creating object of class B with using his constructor!"); B ob2 = new B(); System.out.println(); System.out.println("Creating object of class A with using constructor of class B!"); A ob3 = new B(); System.out.println(); System.out.println(ob1.toString()); System.out.println(ob2.toString()); System.out.println(ob3.toString()); } }
Gubsky