Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
4.6.2 Возврат значенийХотя реализация метода volume() перемещает вычисление объема блока внутрь Box-класса, которому этот метод принадлежит, это – не лучший способ вычисления. Например, что если другая часть вашей программы захотела просто узнать объем блока, но не отображать его значения? Лучший способ реализации метода volume() состоит в том, чтобы он вычислял объем блока и возвращал результат вызывающей программе. Следующий пример (улучшенная версия предшествующей программы) именно это и делает: // Теперь volume() возвращает объем блока. class Box { double width; double height; double depth; // вычислить и возвратить объем double volume() { return width * height * depth; } } class BoxDemo4 { public static void main(String args[]) { Box myboxl = new Box(); Box mybox2 = new Box(); double vol; // присвоить значения переменным экземпляра myboxl myboxl.width =10; myboxl.height = 20; myboxl.depth = 15; /* присвоить другие значения переменным экземпляра mybox2*/ mybox2.width = 3; mybox2.height = 6; mybox2.depth = 9; // получить объем первого блока vol = myboxl.volume(); System.out.println("Объем равен " + vol); // получить объем второго блока vol = mybox2.volume(); System.out.println("Объем равен " + vol); } } Легко заметить, что при вызове метода volume() он помещается справа от оператора назначения (присваивания). Слева находится переменная, в данном случае это переменная vol, которая примет значение, возвращенное методом volume(). Таким образом, после выполнения оператора vol = myboxl.volume(); значение myboxl.volume() становится равным 3000, и это значение затем сохраняется в vol. Еще два важных замечания относительно возвращения значений: - тип данных, возвращаемых методом, должен быть совместим с типом, указанным в заголовке определения метода. Например, если тип возвращаемого значения некоторого метода – boolean, то вы не можете возвращать целое число (типа int); - переменная, принимающая значение, возвращаемое методом (такая, как vol в нашем случае), должна также быть совместима с типом возвращаемого значения, указанным в определении метода. Еще одно замечание: предшествующая программа может быть записана немного эффективнее, потому что нет фактически никакой потребности в переменной vol. Обращение к volume() можно выполнить прямо в утверждении с вызовом println(), например: System.out.println("Объем равен " + myboxl.volume ()); В этом случае при выполнении println() метод myboxl.volume() будет вызываться автоматически, и его значение будут пересылаться к println(). 4.6.3 Добавление метода с параметрамиХотя некоторые методы не нуждаются в параметрах, но большинство из них параметрами все-таки пользуется. Параметры обобщают метод. Параметризованный метод может работать на множестве данных и/или использоваться в ряде похожих ситуаций. Чтобы иллюстрировать это положение, воспользуемся очень простым примером. Имеется метод, который возвращает квадрат числа 10: int square () { return 10 * 10; } Хотя этот метод действительно осуществляет возврат значения 10, возведенного в квадрат, его использование очень ограничено. Однако если вы измените метод так, чтобы он имел параметр, как показано ниже, тогда вы можете сделать метод square() более полезным. int square(int i) { return i * i; } Теперь square() будет возвращать квадрат любого значения, с которым он вызывается. То есть square() стал универсальным методом, который может вычислять квадрат любого целого значения, а не только 10. Например: int х, y; x = square(5); // x равно 25 x = square(9); // x равно 81 y = 2; x = square(у); // x равно 4 В первом обращении к square() параметром i будет передаваться значение 5. Во втором обращении i будет принимать значение 9. Третье обращение передает значение y, которое в этом фрагменте равно 2. Как показывают эти примеры, square() способен возвращать квадрат любых данных, которые ему пересылают. Важно различать два термина параметр и аргумент. Параметр – это переменная, определяемая методом, которая принимает значение во время вызова метода. Например, в методе square(int i) определен один параметр i типа int. Аргумент – это значение, которое передается методу, когда тот вызывается. Например, методу square(100) в качестве аргумента передается число 100. Внутри метода square() это значение принимает параметр i. Улучшим класс Box, используя параметризованный метод. В предыдущих примерах размеры каждого блока должны быть установлены отдельно при помощи последовательности следующих операторов: myboxl.width = 10; myboxl.height = 20; myboxl.depth = 15; Хотя этот код работает, однако возникает некоторое беспокойство. Во-первых, он кажется каким-то не изящным и склонным к ошибкам. Например, легко забыть установку измерений. Во-вторых, в хорошо разработанных Java-программах к переменным экземпляра нужно обращаться только через методы, определенные их классом. В будущем можно изменять поведение метода, но нельзя изменять поведение установленной переменной экземпляра. Таким образом, лучший подход к установке размеров блока состоит в том, чтобы создать метод, который берет измерения блока в свои параметры и подходящим образом устанавливает каждую переменную экземпляра. Эта концепция реализована следующей программой: // Эта программа использует параметризованный метод. class Box { double width; double height; double depth; // вычислить и возвратить объем double volume() { return width * height * depth; } // установить размеры блока void setDim(double w, double h, double d) { width = w; height = h; depth = d; } } class BoxDemo5 { public static void main(String args[]) { Box myboxl = new Box(); Box mybox2 = new Box(); double vol; // инициализировать каждый блок myboxl.setDim(10, 20, 15); mybox2.setDim(3, 6, 9); // получить объем первого блока vol = myboxl.volume (); System.out.println("Объем равен " + vol); // получить объем второго блока vol = mybox2.volume(); System.out.println("Объем равен " + vol); } } Как можно заметить, метод setDim() используется, чтобы установить размеры каждого блока. Например, когда myboxl.setDim(10, 20, 15); выполняется, 10 копируется в параметр w, 20 копируется в h и 15 копируется в d. Внутри метода setDim() значения w, h и d затем назначаются переменным width, height и depth, соответственно. Для многих читателей – особенно тех, кто имеет некоторый опыт программирования в C/C++ – концепции, представленные в предшествующих разделах, конечно знакомы. Однако если такие понятия, как вызовы метода, аргументы и параметры являются для вас новыми, то, прежде чем двигаться дальше, желательно потратить некоторое время на эксперименты. Концепции вызова метода, параметры и возврат значений фундаментальны для Java-программирования. |