Шрифт:
Ниже приведен результат выполнения данной программы. Minivan can carry 7 with range of 336 Miles Sportscar can carry 2 with range of 168 miles
Обратите внимание на то, что вызов метода range в данной программе указывается в правой части оператора присваивания, тогда как в левой его части — переменная, которая принимает значение, возвращаемое методом range . Таким образом, после выполнения следующей строки кода значение дальности действия для объекта minivan сохраняется в переменной rangel: 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."); } }
Выполнение этой программы дает следующий результат: 10 is even. 8 is even.
В данной программе метод isEven вызывается трижды, и каждый раз ему передается новое значение. Рассмотрим подробнее ее исходный код. Обратите сначала внимание на то, каким образом вызывается метод isEven . Его параметр указывается в круглых скобках. При первом вызове методу isEven передается значение 10. Следовательно, когда метод isEven начинает выполняться, параметр х получает значение 10. При втором вызове в качестве аргумента этому методу передается значение 9, которое и принимает параметр х. А при третьем вызове методу isEven передается значение 8, которое опять же присваивается параметру х. Какое бы значение ни указать при вызове метода isEven , его все равно получит параметр х.
В методе может быть определено несколько параметров, и в этом случае они разделяются запятыми. Допустим, в классе Factor имеется метод isFactor , который определяет, является ли первый его параметр множителем второго, как показано ниже. class Factor { //В этом методе предусмотрены два параметра. boolean isFactor(int a, int b) { if( (b % a) == 0) return true; else return false; } } class IsFact { public static void main(String args[]) { Factor x = new Factor; // При вызове методу isFactor передаются два аргумента. if(х.isFactor(2, 20)) System.out.println("2 is factor"); if(x.isFactor(3, 20)) System.out.println("this won't be displayed"); } }
Обратите внимание на то, что при вызове метода isFactor передаваемые ему значения также разделяются запятыми.
При использовании нескольких параметров для каждого из них определяется тип, причем типы параметров могут отличаться. Например, следующее объявление метода является корректным: int myMeth(int a, double b, float с) { // ... Добавление параметризированного метода в класс Vehicle
Параметризированный метод позволяет реализовать в классе Vehicle новую возможность: расчет объема топлива, необходимого для преодоления заданного расстояния. Назовем этот новый метод fuelneededO . Он получает в качестве параметра расстояние в милях, которое должно проехать транспортное средство, а возвращает необходимое для этого количество галлонов топлива. Метод f uelneeded определяется следующим образом: double fuelneeded(int miles) { return (double) miles / mpg; }