Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Java.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
3.45 Mб
Скачать

Глава 3 наследование и интерфейсы

Наследование – один из трех базовых принципов объектно-ориентированного программирования. Благодаря ему появляется возможность создавать иерархические классы объектов. С помощью наследования можно сформировать общий класс, определяющий характерные особенности некоторого понятия. Данный класс наследуется остальными, более конкретными классами, каждый из которых уточняет это понятие и дополняет его уникальными характеристиками.

В языке Java наследуемый класс принято называть суперклассом. Его дочерние классы называются подклассами. Таким образом, подкласс – это специализированная версия суперкласса. Он наследует все переменные и методы, определенные в суперклассе, и дополняет их своими элементами.

Тема 3.1 Основы наследования

Тот факт, что один класс наследует другой, в языке Java отражается в объявлении класса. Для этой цели служит ключевое слово extends. Подкласс дополняет характеристики суперкласса (расширяет его).

Рассмотрим простой пример, иллюстрирующий некоторые свойства наследования. Ниже приведен код программы, в которой определен суперкласс TwoDShape, хранящий сведения о ширине и высоте двумерного объекта. Там же определен и его подкласс Triangle. Обратите внимание на то, что в определении подкласса присутствует ключевое слово extends. В листинге 3.1 показана простая иерархи классов.

Листинг 3.1

// Простая иерархия классов

// Класс, описывающий двумерные объекты

public class TwoDShape {

public double width;

public double height;

public void showDim() {

System.out.println("Width and height are "

+ width + " and " + height);

}

}

// Подкласс класса TwoDShape для представления треугольников.

// Класс Triangle наследует TwoDShape

public class Triangle extends TwoDShape {

String style;

public double area() {

// Из класса Triangle можно обращаться к полям и методам

// класса TwoDShape так же, как и к собственным элементам

return width * height / 2;

}

public void showStyle() {

System.out.println("Triangle is " + style);

}

}

public class Shapes {

public static void main(String args[]) {

Triangle t1 = new Triangle();

Triangle t2 = new Triangle();

// Все члены Triangle, даже унаследованные от TwoDShape,

// доступны посредством объекта Triangle

t1.width = 4.0;

t1.height = 4.0;

t1.style = "isosceles";

t2.width = 8.0;

t2.height = 12.0;

t2.style = "right";

System.out.println("Info for t1: ");

t1.showStyle();

t1.showDim();

System.out.println("Area is " + t1.area());

System.out.println();

System.out.println("Info for t2: ");

t2.showStyle();

t2.showDim();

System.out.println("Area is " + t2.area());

}

}

Здесь в классе TwoDShape определены атрибуты "универсальной" двумерной фигуры, конкретным представителем которой может быть квадрат, треугольник прямоугольник и т.д. Класс Triangle представляет конкретный тип объект TwoDShape, в данном случае треугольник. Класс Triangle включает все элементы класса TwoDObiect и в дополнение к ним – поле style и методы area() и showStyle(). Описание треугольника хранится в переменной style, метод area() вычисляет и возвращает площадь треугольника, а метод showStyle() отображает описание.

Поскольку класс Triangle содержит все члены суперкласса TwoDShap() в теле метода area() доступны переменные width и height. Кроме того в теле метода main () можно с помощью объектов tl и t2 непосредственно обращаться к переменным width и height так, как будто они принадлежат классу Triangle. На рисунке 3.1 условно показано, каким образом суперкласс TwoDShape включается в состав класса Triangle.

TwoDShape

widht

Triangle

height

showDim()

style

area()

showStyle()

Рисунок 3.1 – Условное представление класса Triangle

Даже несмотря на то, что TwoDShape является суперклассом класса Triangle, он все-таки остается независимым классом. Тот факт, что класс является суперклассом другого класса, не означает, что он не может быть использован сам по себе. Например, следующий фрагмент кода составлен корректно:

TwoDShape shape = new TwoDShape();

shape.width = 10;

shape.height = 20;

shape.showDim();

Класс TwoDShape не имеет сведений о своих подклассах и не может обратиться к ним.

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

class имя_класса extends имя_суперкласса {

/ / тело класса

}

Для каждого создаваемого класса можно указать только один суперкласс. Множественное наследование в Java не поддерживается, т.е. подкласс не может иметь несколько суперклассов. (язык Java отличается от языка С++, где разработчик может создать класс, дочерний по отношению сразу к нескольким классам. Это надо помнить, преобразуя код С++ в Java.) С другой стороны, многоуровневая иерархия, По которой подкласс выступает в то же время как суперкласс другого класса, вполне возможна. И конечно же, класс не может быть суперклассом для самого себя.

Главное преимущество наследования состоит в том, что суперкласс, содержащий определения атрибутов, общих для набора объектов, может быть использован для создания любого количества более конкретных подклассов. Каждый подкласс уточняет понятие, представляемое своим супрерклассом. В качестве примера рассмотрим еще один подкласс класса TwoDShape, который инкапсулирует прямоугольники(листинг 3.2):

Листинг 3.2

// Подкласс класса TwoDShape, представляющий прямоугольник

public class Rectangle extends TwoDShape {

public boolean isSquare() {

if (width == height) {

return true;

}

return false;

}

public double area() {

return width * height;

}

}

Класс Rectangle включает элементы класса TwoDShape и, кроме того, содержит метод isSquare(), определяющий, является ли прямоугольник квадратом, и метод area(), вычисляющий площадь прямоугольника.

Задание:

Разработать класс Животные. Поля–вес, возраст, имя. Методы – для изменения полей, для выведения всех полей.

Класс Кот наследуется от Животных. Поле – количество пойманных мышей. Методы – для изменения поля, для выведения всех полей.