Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
5.2.1 Перегрузка конструкторовВ дополнение к перегрузке обычных методов можно также перезагружать методы конструкторов. Фактически, для наиболее реальных классов, которые вы создаете, перезагруженные конструкторы будут нормой, а не исключением. Для объяснения этого утверждения вернемся к классу Box, приводимом ранее. Самая последняя версия Box выглядит так: class Box { double width; double height; double depth; // Это конструктор класса Box. Box(double w, double h, double d) { width = w; height = h; depth = d; } // вычислить и возвратить объем double volume() { return width * height * depth; } } Здесь конструктор Box() имеет три параметра. Это означает, что все объявления Box‑объектов должны переслать в конструктор Box() три аргумента. Например, следующий оператор недопустим: Box ob = new Box(); Так как Box() требует трех параметров, то его вызов без них – это ошибка. Решается проблема совсем просто: перегрузите конструктор Box так, чтобы он обрабатывал необходимые ситуации. Ниже показана программа, содержащая улучшенную версию класса вох, который именно это и делает: /* Класс Box: три конструктора для разных способов инициализации размеров блока. */ class Box { double width; double height; double 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; } } class OverloadCons { public static void main(String args[]) { // создать блоки, используя различные конструкторы Box myboxl = new Box(10, 20, 15); Box mybox2 = new Box(); Box mycube = new Box(7); double vol; // получить объем первого блока vol = myboxl.volume(); System.out.println("Объем myboxl равен " + vol); // получить объем второго блока vol = mybox2.volume(); System.out.println("Объем mybox2 равен " + vol); // получить объем куба vol = mycube.volume(); System.out.println("Объем mycube равен " + vol); } } Вывод, выполненный этой программой: Объем myboxl равен 3000.0 Объем mybox2 равен -1.0 Объем mycube равен 343.0 Как вы видите, подходящий перегруженный конструктор вызывается, основываясь на параметрах, указанных при выполнении операции new. 5.3 Использование объектов в качестве параметровДо сих пор мы использовали в качестве параметров методов только простые типы. Однако существует практика передачи методам объектов. Например, рассмотрим следующую простую программу: // Объекты можно передавать методам в качестве параметров. class Test { int a, b; Test(int i, int j) { a = i; b = j; } // возвратить true, если о равно вызывающему объекту boolean equals(Test o) { if(o.a == a && o.b == b) return true; else return false; } } class Passob { public static void main(String args[]) { Test ob1 = new Test(100, 22); Test ob2 = new Test(100, 22); Test ob3 = new Test(-1, -1); System.out.println("ob1 == ob2: " + ob1.equals(ob2)); System.out.println("ob1 == ob3: " + ob1.equals(ob3)); } } Эта программа генерирует следующий вывод: ob1 == ob2: true ob1 == ob3: false Не трудно видеть, что метод equals() внутри класса Test сравнивает два объекта на равенство и возвращает результат. То есть, он сравнивает вызывающий объект с тем, который передан методу. Если они содержат те же значения, то метод возвращает true. Иначе, он возвращает false. Обратите внимание, что параметр o в методе equals() указывает Test в качестве своего типа. Хотя Test – это тип класса, созданный программой, он используется точно таким же способом, как и встроенные типы Java. Чаще всего в качестве параметров объекта используются конструкторы. Возможно, вы захотите построить новый объект так, чтобы он был первоначально таким же, как некоторый существующий. Чтобы сделать это, вы должны определить конструктор, который имеет объект своего класса в качестве параметра. Например, следующая версия Box позволяет одному объекту инициализировать другой: // Здесь 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; } } class OverloadCons2 { public static void main(String args[]) { // создать блоки с использованием различных конструкторов Box myboxl = new Box(10, 20, 15); Box mybox2 = new Box (); Box mycube = new Box(7); Box myclone = new Box(myboxl); double vol; // получить объем первого блока vol = myboxl.volume (); System.out.println("Объем myboxl равен " + vol); // получить объем второго блока vol = mybox2.volume(); System.out.println("Объем mybox2 равен " + vol); // получить объем куба vol = mycube.volume (); System.out.println("Объем cube равен " + vol); // получить объем клона vol = myclone.volume(); System.out.println("Объем clone равен " + vol); } } Когда вы начинаете создавать собственные классы, обычно нужно организовывать много форм конструкторов, что позволит образовывать объекты удобным и эффективным способом. |