Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

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

/* В иерархии классов приватные члены остаются приватными

для своего класса.

Эта программа содержит ошибку, и ее компиляция

будет невозможна.

*/

// Создание суперкласса.

class A {

int i; // общедоступная по умолчанию

private int j; // приватная для A

void setij(int x, int y) {

i = x;

j = y;

}

}

// Переменная j класса A в этом классе недоступна.

class B extends A {

int total;

void sum() {

total = i + j; // ОШИБКА, j в этом классе недоступна

}

}

class Access {

public static void main(String args[]) {

B subOb = new B();

subOb. setij(10, 12);

subOb. sum();

System. out. println(" Сумма равна " + subOb. total);

}

}

Компиляция этой программы будет невозможна, поскольку ссылка на переменную j внутри метода sum() класса B приводит к нарушению правил доступа. Поскольку переменная j объявлена как private, она доступна только другим членам ее собственного класса. Подкласс не имеет к ней доступа.

Рассмотрим более реальный пример, который поможет проиллюстрировать возможности наследования. В нем мы расширим последнюю версию класса Box, разработанную в предыдущей главе, добавив в нее четвертый компонент, который назовем weight (вес).

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

// В этой программе наследование используется для расширения класса Box.

class Box {

double width;

double height;

double depth;

// конструирование клона объекта

Box(Box ob) { // передача объекта конструктору

width = ob. width;

height = ob. height;

depth = ob. depth;

}

// конструктор, используемый при указании всех измерений

Box(double w, double h, double d) {

width = w;

height = h;

depth = d;

}

// конструктор, используемый, если ни одно из изменений не указано

Box() {

width = -1; // значение -1 используется для указания

height = -1; // неинициализированного

depth = -1; // параллелепипеда

}

// конструктор, используемый при создании куба

Box(double len) {

width = height = depth = len;

}

// вычисление и возврат объема

double volume() {

return width * height * depth;

}

}

// Расширение класса Box включением в него веса.

class BoxWeight extends Box {

double weight; // вес параллелепипеда

// конструктор BoxWeight

BoxWeight(double w, double h, double d, double m) {

width = w;

height = h;

depth = d;

weight = m;

}

}

class DemoBoxWeight {

public static void main(String args[]) {

BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34. 3);

BoxWeight mybox2 = new BoxWeight(2, 3, 4, 0. 076);

double vol;

vol = mybox1. volume();

System. out. println(" Объем mybox1 равен " + vol);

System. out. println(" Вес mybox1 равен " + mybox1. weight);

System. out. println();

vol = mybox2. volume();

System. out. println(" Объем mybox2 равен " + vol);

System. out. println(" Вес mybox2 равен " + mybox2. weight);

}

}

Эта программа генерирует следующий вывод:

Объем mybox1 равен 3000. 0

Вес mybox1 равен 34. 3

Объем mybox2 равен 24. 0

Вес mybox2 равен 0. 076

Класс BoxWeight наследует все характеристики класса Box и добавляет к ним компонент weight. Классу BoxWeight не нужно воссоздавать все характеристики класса Box. Он может просто расширять Box в соответствии с конкретными целями.

Основное преимущество наследования состоит в том, что как только суперкласс, который определяет общие атрибуты набора объектов, создан, его можно использовать для создания любого числа более специализированных классов. Каждый подкласс может точно определять свою собственную классификацию. Например, следующий класс наследует характеристики класса Box и добавляет атрибут цвета.

// Этот код расширяет класс Box, включая в него атрибут цвета.

class ColorBox extends Box {

int color; // цвет параллелепипеда

ColorBox(double w, double h, double d, int c) {

width = w;

height = h;

depth = d;

color = c;

}

}

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

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

Ссылочной переменной суперкласса может быть присвоена ссылка на любой подкласс, производный от данного суперкласса. Этот аспект наследования будет весьма полезен во множестве ситуаций. Рассмотрим следующий пример:

class RefDemo {

public static void main(String args[]) {

BoxWeight weightbox = new BoxWeight(3, 5, 7, 8. 37);

Box plainbox = new Box();

double vol;

vol = weightbox. volume();

System. out. println(" Объем weightbox равен " + vol);

System. out. println(" Вес weightbox равен " +

weightbox. weight);

System. out. println();

// присваивание объекту BoxWeight ссылки на ссылку объекта Box

plainbox = weightbox;

vol = plainbox. volume(); // OK, метод volume() определен в Box

System. out. println(" Объем plainbox равен " + vol);

BookNew_JAVA-7. indb 195 02. 06. 2007 1: 06: 53

196 Часть I. Язык Java

/* Следующий оператор ошибочен, поскольку plainbox

не определяет член weight. */

// System. out. println(" Вес plainbox равен " + plainbox. weight);

}

}

В этом примере weightbox – ссылка на объекты BoxWeight, а painbox – ссылка на объекты Box. Поскольку BoxWeight – подкласс класса Box, ссылке painbox можно присваивать ссылку на объект weightbox.

Важно понимать, что доступные объекты определяются типом ссылочной переменной, а не типом объекта, на который она ссылается. То есть при присваивании ссылочной переменной суперкласса ссылки на объект подкласса доступ предоставляется только к указанным в ней частям объекта, определенного суперклассом. Именно поэтому объект plainbox не имеет доступа к переменной weight даже в том случае, когда он ссылается на объект BoxWeight. Если немного подумать, это становится понятным – суперклассу не известно, что именно подкласс добавляет в него. Поэтому последняя строка кода в предыдущем фрагменте оформлена в виде комментария. Ссылка объекта Box не имеет доступа к полю weight, поскольку оно не определено в классе Box.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...