Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
5.8 Основы наследованияЧтобы наследовать класс, нужно просто включить определение одного класса в другое, используя ключевое слово extends. Чтобы увидеть, как это делается, начнем с короткого примера. Следующая программа создает суперкласс с именем A и подкласс с именем B. Обратите внимание, как используется ключевое слово extends, чтобы создать подкласс A. // Простой пример наследования. // Создать суперкласс class A { int i, j; void showij () { System.out.println("i и j: " + i + " " + j); } } // Создать подкласс расширением класса а. class B extends A { int k; void showk() { System.out.println("k: " + k); } void sum() { System.out.println("i+j+k: "+ (i+j+k) ); } } class Simplelnheritance { public static void main(String args[]) { A superOb = new A(); B subOb = new B(); // Суперкласс может быть использован сам по себе. superOb.i = 10; superOb.j = 20; System.out.println("Содержимое superOb: "); superOb.showij(); System.out.println(); /* Подкласс имеет доступ ко всем public-членам его суперкласса. */ subOb.i = 7; subOb.j = 8; subOb.k = 9; System.out.println("Содержимое of subOb: "); subOb.showij(); subOb.showk(); System.out.println(); System.out.println("Сумма i, j и k в subOb:"); subOb.sum(); } } Подкласс B включает все члены его суперкласса A. Вот почему объект subOb может обращаться к i и j и вызывать showij(). Поэтому же внутри sum() можно прямо ссылаться на i и j, как если бы они были частью B. Хотя A – суперкласс для B, он тоже полностью независимый, автономный класс. Роль суперкласса для некоторого подкласса не означает, что этот суперкласс не может использоваться сам по себе. Более того, подкласс может быть суперклассом для другого подкласса. Вывод этой программы: Содержимое superOb: i и j: 10 20 Содержимое of subOb: i и j: 7 8 k: 9 Сумма i, j и k в subOb: i+j+k: 24 Ниже показана общая форма объявления класса, который наследует суперкласс: class subclass-name extends superclass-name { // тело класса } где subclass-name – имя подкласса, superclass-name – имя суперкласса. Можно определять только один суперкласс для любого подкласса, который вы создаете. Java не поддерживает наследования множества суперклассов в одиночном подклассе. (Это отличает Java от С++, в котором можно наследовать множество базовых классов) Можно создавать иерархию наследования, в которой подкласс становится суперклассом другого подкласса. Никакой класс не может быть суперклассом самого себя. 5.9 Доступ к элементам и наследованиеХотя подкласс включает все элементы (члены) своего суперкласса, он не может обращаться к тем элементам суперкласса, которые были объявлены как private. Например, рассмотрим следующую простую иерархию классов: /* В иерархии классов private члены остаются private для ее классов. Эта программа содержит ошибку и не будет компилироваться. */ // Создать суперкласс. class A { int i; // public по умолчанию private int j; // private для 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() класса в вызывает нарушение правил доступа. С тех пор как j объявлена с помощью private, она доступна только другим членам его собственного класса. Подклассы не имеют доступа к ней. Замечание. Член класса, который был объявлен как private, остается 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 myboxl = new BoxWeight(10, 20, 15, 34.3); BoxWeight mybox2 = new BoxWeight( 2, 3, 4, 0.076); double vol; vol = myboxl.volume(); System.out.println("Объем myboxl равен " + vol); System.out.println("Вес myboxl равен " + myboxl.weight); System.out.println(); vol = mybox2.volume(); System.out.println("Объем mybox2 равен " + vol); System.out.println("Вес mybox2 равен " + mybox2.weight); } } Вывод этой программы: Объем myboxl равен 3000.0 Вес myboxl равен 34.3 Объем mybox2 равен 24.0 Вес mybox2 равен 0.076 BoxWeight наследует все характеристики Box и прибавляет к ним компонент weight. Для BoxWeight нет необходимости заново создавать все свойства Box. Можно просто расширить Bох, чтобы достичь своих собственных целей. Главное преимущество наследования состоит в том, что, как только вы создали суперкласс, который определяет общие для набора объектов атрибуты, его можно использовать для создания любого числа более специфичных подклассов. Каждый подкласс может добавить свою собственную классификацию. Например, следующий класс наследует Box и прибавляет цветовой атрибут: // Box расширяется для включения цвета. class ColorBox extends Box { int color; // color of box ColorBox(double w, double h, double d, int c) { width = w; height = h; depth = d; color = c; } } Помните, как только вы создали суперкласс, который определяет общие аспекты объекта, этот суперкласс может наследоваться для формирования специализированных классов. Каждый подкласс просто прибавляет свои собственные, уникальные атрибуты. В этом сущность наследования. |