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

Тема 3.5 Использование ключевого слова super для доступа к членам суперкласса

Существует еще одна форма ключевого слова super, которая применяется подобно this, но ссылается на суперкласс класса. Формат обращения к члену суперкласса имеет следующий вид:

super.член_класса

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

Данная форма super применяется тогда, когда член подкласса маскирует член суперкласса. Рассмотрим следующую несложную иерархию классов(листинг 3.8):

Листинг 3.8

// Использование ключевого слова super

// для предотвращения маскировки имен

public class A {

public int i;

}

// Создание подкласса, расширяющего класс А

public class B extends A {

public int i; // Данная переменная i маскирует

// переменную i в составе класса А

public B(int a, int b) {

// Выражение super.i ссылается на переменную i в классе А

super.i = a; // i в классе А

i = b; // i в классе В

}

public void show() {

System.out.println("i in superclass: " + super.i);

System.out.println("i in subclass: " + i);

}

}

class UseSuper {

public static void main(String args[]) {

B subOb = new B(1, 2);

subOb.show();

}

}

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

Тема 3.6 Многоуровневая иерархия

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

Для того чтобы лучше понять использование многоуровневой иерархии, рассмотрим следующую программу. В ней подкласс Triangle выступает в роли суперкласса для класса ColorTriangle. Класс ColorTriangle наследует все свойства Triangle и TwoDShape, и, кроме того, в нем имеется поле color, определяющее цвет треугольника (листинг 3.9).

Листинг 3.9

// Многоуровневая иерархия

public class TwoDShape {

private double width;

private double height;

// Конструктор по умолчанию

public TwoDShape() {

width = height = 0.0;

}

// Конструктор с параметрами

public TwoDShape(double w, double h) {

width = w;

height = h;

}

// Формирование объекта с одинаковыми

// значениями width и height

public TwoDShape(double x) {

width = height = x;

}

// Методы доступа к переменным width и height

public double getWidth() {

return width;

}

public double getHeight() {

return height;

}

public void setWidth(double w) {

width = w;

}

public void setHeight(double h) {

height = h;

}

public void showDim() {

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

+ width + " and " + height);

}

}

// Подкласс класса TwoDShape

public class Triangle extends TwoDShape {

private String style;

// Конструктор по умолчанию

public Triangle() {

super();

style = "null";

}

public Triangle(String s, double w, double h) {

super(w, h); // Вызов конструктора суперкласса

style = s;

}

// Формирование равнобедренного треугольника

public Triangle(double x) {

super(x); // Вызов конструктора суперкласса

style = "isosceles";

}

public double area() {

return getWidth() * getHeight() / 2;

}

public void showStyle() {

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

}

}

// Подкласс класса Triangle.

// Класс ColorTriangle является подклассом Triangle

// который, в свою очередь, расширяет класс TwoDShape.

// Следовательно, ColorTriangle содержит переменные

// и методы как класса Triangle, так и класса TwoDShape.

public class ColorTriangle extends Triangle {

private String color;

public ColorTriangle(String c, String s,

double w, double h) {

super(s, w, h);

color = c;

}

public String getColor() {

return color;

}

public void showColor() {

System.out.println("Color is " + color);

}

}

public class Shapes6 {

public static void main(String args[]) {

ColorTriangle t1 = new ColorTriangle("Blue", "right", 8.0, 12.0);

ColorTriangle t2 = new ColorTriangle("Red", "isosceles", 2.0, 2.0);

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

t1.showStyle();

t1.showDim();

t1.showColor();

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

System.out.println();

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

// Из объекта ColorTriangle можно вызывать методы,

// принадлежащие как ему самому, так и его суперклассам

t2.showStyle();

t2.showDim();

t2.showColor();

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

}

}

Благодаря наследованию ColorTriangle может использовать ранее определенные классы Triangle и TwoDShape, добавляя лишь информацию, специфическую для той задачи, для которой создавался ColorTriangle. Таким образом, наследование способствует повторному использованию кода.

Данный пример также иллюстрирует еще одну важную деталь: выражение super() всегда ссылается на конструктор ближайшего суперкласса. Другими словами, выражение super() в ColorTriangle означает вызов конструктора Triangle. В классе же Triangle вызов super() относится к конструктору TwoDShape. Если в иерархии классов для конструктора суперкласса предусмотрены параметры, то все суперклассы должны передавать их вверх по иерархической структуре. Это правило не зависит от того, нужны ли параметры самому подклассу.

Задание:

Добавьте класс Котенок(потомок класса Кот) с полем время кормления. Напишите конструктор.