Возврат из метода осуществляется при выполнении одного из двух условий. Первое из них вам уже знакомо по методу range (), а именно: признаком завершения метода и возврата из него служит закрывающая круглая скобка. Вторым условием является выполнение оператора return. Существуют две разновидности оператора return: одна — для методов типа void, не возвращающих значение, а другая — для методов, возвращающих значение вызывающей части программы. Здесь мы рассмотрим первую разновидность оператора return, а о возвращаемых значениях речь пойдет в следующем разделе.
Организовать немедленное завершение метода типа void и возврат из него можно с помощью следующей формы оператора return: return ;
При выполнении этого оператора управление будет возвращено вызывающей части программы, а оставшийся в методе код будет проигнорирован. Рассмотрим в качестве примера следующий метод: void myMeth() { int i; for(i=0; i<10; i++) { if(i == 5) return; // завершить цикл на значении 5 System.out.println(); } }
Здесь переменная цикла for принимает лишь значения от 0 до 5. Как только значение переменной i становится равным 5, цикл завершается и происходит возврат из метода. В одном методе допускается несколько операторов return. Необходимость в них возникает в том случае, если в методе организовано несколько ветвей выполнения, как в приведенном ниже примере, void myMeth() { // ... if(done) return; // ... if(error) return; // ... }
В данном примере метод возвращает управление вызывающей части программы либо по завершении всех необходимых действий, либо при появлении ошибки. Применяя операторы return, следует соблюдать осторожность: слишком большое количество точек возврата из метода нарушает структуру кода. В грамотно написанном методе точки возврата четко определены.
Итак, метод типа void может быть завершен одним из двух способов: по достижении закрывающей фигурной скобки тела метода или при выполнении оператора return. Возврат значения
Несмотря на то что методы типа void встречаются довольно часто, большинство методов все же возвращают значения. Способность возвращать значение относится к одним из самых полезных свойств метода. Пример возврата значения уже встречался ранее в этой книге, когда для вычисления квадратного корня использовался метод sqrt ().
В программировании возвращаемые значения применяются для самых разных целей. В одних случаях, как, например, при обращении к методу sqrt (), возвращаемое значение представляет собой результат некоторых расчетов. А в других случаях это значение лишь сообщает, успешно ли были выполнены действия, предусмотренные в методе. При этом возвращаемое значение нередко содержит код состояния. Независимо от конкретного способа применения, возвращаемые значения являются неотъемлемой частью программирования на Java.
Методы возвращают значения вызывающей части программы, используя следующую форму оператора return: return значение;
где значение — конкретное возвращаемое значение. Данная форма оператора return может быть использована только в тех методах, тип которых отличается от типа void. Более того, подобные методы обязаны возвращать значение, используя данную форму оператора return.
Теперь мы можем немного видоизменить метод range () с учетом возвращаемых значений. Вместо того чтобы отображать дальность в методе range (), лучше ограничиться ее расчетом и возвратом полученного значения. Преимущество такого подхода заключается, в частности, в том, что возвращаемое значение может быть использовано при выполнении других расчетов. В приведенном ниже примере метод range () видоизменен, возвращая значение, которое затем выводится на экран. // Использование возвращаемого значения, class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон // Возврат дальности действия для заданного транспортного средства. int range() { return mpg * fuelcap; } } class RetMeth { public static void main(String args[]) { Vehicle minivan = new Vehicle(); Vehicle sportscar = new Vehicle(); int rangel, range2; // присвоить значения полям в объекте minivan minivan.passengers = 7; minivan.fuelcap = 16; minivan.mpg = 21; // присвоить значения полям в объекте sportscar sportscar.passengers = 2; sportscar.fuelcap = 14; sportscar.mpg = 12; // получить дальности действия разных транспортных средств // Возвращаемое методом значение присваивается переменной. rangel = minivan.range() ; range2 = sportscar.range(); System.out.println("Minivan can carry " + minivan.passengers + " with range of " + rangel + " Miles"); System.out.println("Sportscar can carry " + sportscar.passengers + " with range of " + range2 + " miles"); } }
Ниже приведен результат выполнения данной программы. Minivan can carry 7 with range of 336 Miles Sportscar can carry 2 with range of 168 miles
Обратите внимание на то, что вызов метода range () в данной программе указывается в правой части оператора присваивания, тогда как в левой его части — переменная, которая принимает значение, возвращаемое методом range (). Таким образом, после выполнения следующей строки кода значение дальности действия для объекта minivan сохраняется в переменной rangeclass="underline" rangel = minivan.range();.
Следует иметь в виду, что в данном случае метод range () возвращает значение типа int, т.е. вызывающая часть программы получает целочисленное значение. Тип возвращаемого значения — очень важная характеристика метода, поскольку возвращаемые данные должны соответствовать типу, указанному в определении метода. Иными словами, если метод должен возвращать значение типа double, то именно таким и следует объявить его тип.
Несмотря на то что приведенная выше программа компилируется и выполняется без ошибок, ее эффективность можно повысить. В частности, переменные rangel и range2 в ней не нужны. Вызов метода range () можно непосредственно указать в качестве параметра метода println (), как показано ниже. System.out.println("Minivan can carry " + minivan.passengers + " with range of " + minivan.range() + " Miles");
В данном случае при выполнении метода println () будет автоматически осуществляться вызов minivan. range (), а полученное в итоге значение — передаваться методу println (). Более того, к методу range () можно обратиться в любой момент, когда понадобится значение дальности действия для объекта типа Vehicle. В качестве примера ниже приведено выражение, в котором сравнивается дальность действия двух транспортных средств. if(vl.range() > v2.range()) System.out.println("vl has greater range"); Использование параметров
При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром. Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу параметры действуют так же, как и любые другие переменные.
Ниже приведен простой пример программы, демонстрирующий использование параметров. В классе ChkNum метод isEven () возвращает логическое значение true, если значение, передаваемое при вызове этого метода, является четным числом. В противном случае метод возвращает логическое значение false. Таким образом, метод isEven () возвращает значение типа boolean. // Простой пример применения параметра в методе. class ChkNum { // возвратить логическое значение true, // если х содержит четное число // Здесь х — целочисленный параметр метода isEven(). boolean isEven(int x) { if((x%2) == 0) return true; else return false; } } class ParmDemo { public static void main(String args[]) { ChkNum e = new ChkNum(); // В следующих строках кода передаются аргументы методу isEven(). if(е.isEven(10)) System.out.println("10 is even."); if (e.isEven(9)) System.out.println("9 is even."); if (e.isEven(8)) System.out.println("8 is even."); } }