
3.2.8 Расширение других классов
Одним из самых главных достоинств ООП является возможность использования методов и полей уже созданных классов. Создавая расширенные классы на базе простых, можно при разработке сэкономить много времени и усилий, а также значительно упростить поиск и исправление ошибок в программе.
Расширяя суперкласс, мы делаем новую копию имеющегося класса, однако эту копию можно развивать.
Каждый класс в языке Java считается объектом. По умолчанию каждый класс порождается от класса java.lang.Object. Поэтому, если класс не расширяет какой-нибудь другой класс, он будет расширять класс java.lang.Object
Множественное наследование в языке Java отсутствует. Поэтому, в oтличие от С++, классы Java могут расширять только один класс.
Наследование позволяет определить общий класс, а затем определять другие классы путем добавления новых деталей в уже созданное более общее определение класса.
Общий класс называется базовым или супер- или родительским классом. Полученный на его основе класс называется производным или наследуемым или sub- или наследник класс.
Пример. Пусть базовый тип - “фигура”, а каждая фигура имеет размер, цвет, положение. Каждая фигура может быть нарисована, стерта, перемещена, окрашена и т.д. От нее образуются (наследуются) специфические типы: окружность, квадрат, треугольник, каждый из которых может иметь дополнительные характеристики и черты поведения. Определенные фигуры могут быть зеркально отражены, например. Некоторые черты поведения могут отличаться, например, если нужно посчитать площадь фигуры. Класс "Фигура" иерархически объединяет и похожие и различные черты фигур.
3.2.9 Переопределение и перегрузка
Когда мы наследуем от существующего класса, мы создаем новый класс. Этот новый класс содержит не все члены существующего типа (private члены спрятаны и недоступны). Но самое важное - дублирование кода базового класса. То есть, все сообщения, которые можно послать объекту базового класса, можно послать объекту наследуемого класса. Это означает, что наследуемый класс того же типа, что и базовый класс.
Есть два способа сделать новый класс отличным от оригинального базового класса. Первый достаточно простой: мы добавляем несколько новых функций к наследуемому классу. Однако не исключено, что и базовому классу может не хватать дополнительных функций. Этот процесс обнаружения и повторения при разработке встречается регулярно в объектно-ориентированном программировании.
В Java ключевое слово, означающее наследование - extends.
Второй, наиболее важный способ сделать новый класс отличным от класса-родителя заключается в изменении поведения существующей функции базового класса. Это называется переопределением.
Для переопределения метода создается новое определение для метода в наследуемом классе. Мы говорим: “Мы используем ту же функцию, но мы будем делать что-то другое для нового типа".
Перегрузка метода - задание нового определения для метода, но с другим числом параметров или с параметрами другого типа. Тогда класс-наследник будет иметь два метода с одним и тем же именем.
3.2.10 Пример наследования
Условие. Задать классы фигур, прямоугольников, треугольников, определить их площади и периметры.
public class Shape{
public int top,left,bot,right;
public int square(){
int i;
i=(bot-top)*(right-left);
return i;
}
}
public class Poly extends Shape{
public int perim(){
int j;
j=2*((bot-top)+(right-left));
return j;
}
}
public class Triangle extends Shape{
public int x2,y2,x3,y3;
public double a1,a2,a3;
public int perim(){
int j;
a1=Math.sqrt((y2-top)*(y2-top)+(x2-left)*(x2-left));
a2=Math.sqrt((y3-top)*(y3-top)+(x3-left)*(x3-left));
a3=Math.sqrt((y3-y2)*(y3-y2)+(x3-x2)*(x3-x2));
j=(int)(a1+a2+a3);
return j;
}
public int square(){
int i;
i=(int)(a2*a3/2);
return i;
}
}
В другом файле наберем автономную программу Еgor.java, в которой воспользуемся классами Poly и Triangle. В этой программе создадим объекты прямоугольника и треугольника. Инициализацию их значений выполним при помощи конструктора.
public class Egor{
public static void main(String args[])
{
int i,s1,s2,pert;
String a;
Poly p=new Poly();
Triangle t=new Triangle();
3.4 Порядок выполнения и методические указания по выполнению работы
-
Составьте диаграмму классов согласно варианта задания.
-
Опишите базовый класс и классы-наследники.
-
Напишите автономную программу, работающую с экземплярами созданных классов.
3.5. Содержание отчета
В отчет необходимо включить:
цель лабораторной работы;
описание понятий наследования, переопределения;
распечатку текста описания классов и автономной программы и результатов ее работы;
выводы.
3.6. Контрольные вопросы и задания
-
Что представляют собой объекты и классы?
-
Какие элементы включают в себя объявление класса? Для чего служат модификаторы?
-
Что такое метод? Как его объявить?
-
Какие существуют спецификаторы и модификаторы методов?
-
Что такое поля класса? Какие модификаторы можно использовать с полями?
-
Что такое расширение класса?
-
Как связаны базовый и производные классы?
-
Что такое переопределение? Как его задать?