Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Следует иметь в виду, что в данном случае метод 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;}
Обратите внимание на то, что этот метод возвращает значение типа double. Это важно, поскольку объем потребляемого топлива не всегда можно выразить целым числом. Ниже приведен исходный код программы для расчета дальности действия транспортных средств с классом Vehicle, содержащим метод fuelneeded ()./*Добавление параметризированного метода, в котором производитсярасчет объема топлива, необходимого транспортному средству дляпреодоления заданного расстояния.*/class Vehicle { int passengers; // количество пассажиров int fuelcap; // емкость топливного бака int mpg; // потребление топлива в милях на галлон // возвратить дальность действия транспортного средства int range() { return mpg * fuelcap; } // рассчитать объем топлива, необходимого транспортному // средству для преодоления заданного расстояния double fuelneeded(int miles) { return (double) miles / mpg; }}class CompFuel { public static void main(String args[]) { Vehicle minivan = new Vehicle(); Vehicle sportscar = new Vehicle(); double gallons; int dist = 252; // присвоить значения полям в объекте minivan minivan.passengers = 7; minivan.fuelcap = 16; minivan.mpg = 21; // присвоить значения полям в объекте sportscar sportscar.passengers = 2; sportscar.fuelcap = 14; sportscar.mpg = 12; gallons = minivan.fuelneeded(dist) ; System.out.println("To go " + dist + " miles minivan needs " + gallons + " gallons of fuel."); gallons = sportscar.fuelneeded(dist); System.out.println("To go " + dist + " miles sportscar needs " + gallons + " gallons of fuel."); }}
Выполнение этой программы дает следующий результат:То до 252 miles minivan needs 12.0 gallons of fuel.To go 252 miles sportscar needs 21.0 gallons of fuel.
Пример для опробования 4.1.Создание справочного класса
Если попытаться кратко выразить сущ¬ность классов, то следовало бы сказать,что класс инкапсулирует функциональные возможности. Иногда трудно определить, где оканчиваются одни функциональные возможности и начинаются другие. Класс должен быть стандартным блоком для компоновки приложения. Для этой цели класс необходимо спроектировать таким образом, чтобы он представлял собой одну функциональную единицу, выполняющую строго определенные действия. Следовательно, нужно стремиться к тому, чтобы классы были как можно более компактными, но в разумных пределах! Ведь классы, реализующие лишние функциональные возможности, делают код сложным для понимания и плохо структурированным, но классы со слишком ограниченными функциональными возможностями приводят к тому, что программа становится неоправданно фрагментированной. Как же найти золотую середину? В поисках ее наука программирования превращается в искусство программирования. Многие программисты считают, что такая способность приходит с опытом.