Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
12.05.2015
Размер:
624.64 Кб
Скачать

Возврат значений

Хотя реализация метода 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 &rgs[]) {

Box myboxl = new Box();

Box mybox2 = new Box ();

double vol;

// присвоить значения переменным экземпляра mybox1

myboxl.width = 10;

myboxl.height = 20;

myboxl.depth = 15;

/* присвоить другие значения переменным экземпляра niybox2

rnybox2. width = 3;

mybox2.height = 6;

mybox2.depth = 9;

// получить объем первого блока

vol = myboxl.volume();

System.out.println("Объем равен " + vol);

// получить объем второго блока

vol = mybox2.volume();

System.out.println("Объем равен " + vol);

}

}

He трудно заметить, что при вызове метода volume() он помещается спра­ва от оператора назначения (присваивания). Слева находится переменная, в данном случае это переменная vol, которая примет значение, возвращен­ное методом volume(). Таким образом, после выполнения оператора

vol = myboxl.volume();

значение myboxl.volume() становится равным 3000, и это значение затем сохраняется в vol. Еще два важных замечания относительно возвращения значений:

  • тип данных, возвращаемых методом, должен быть совместим с типом, указанным в заголовке определения метода. Например, если тип возвра­щаемого значения некоторого метода – boolean, вы не можете возвра­щать целое число типа int;

  • переменная, принимающая значение, возвращаемое методом (такая, как vol в нашем случае), должна также быть совместима с типом возвращае­мого значения, указанным в определении метода.

Еще одно замечание: предшествующая программа может быть записана не­много эффективнее, потому что нет фактически никакой потребности в пе­ременной vol. Обращение к volume() можно выполнить прямо в утвержде­нии с вызовом println(), например:

System.out.println("Объем равен " + mybox1.volume());

В этом случае при выполнении println() метод mybox1.volume() будет вы­зываться автоматически, и его значение будут пересылаться в println().

Добавление метода с параметрами

Хотя некоторые методы не нуждаются в параметрах, но большинство из них параметрами все-таки пользуется. Параметры обобщают метод. Параметри­зованный метод может работать на множестве данных и/или использоваться в ряде похожих ситуаций. Чтобы иллюстрировать это положение, воспользу­емся очень простым примером. Имеется метод, который возвращает квадрат числа 10:

int square() {

return 10 * 10;

}

Хотя этот метод действительно осуществляет возврат значения 10, возведен­ного в квадрат, его использование очень ограничено. Однако если изме­нить метод так, чтобы он имел параметр, как показано ниже, он окажется более полезным.

int square (int i) {

return i * i;

}

Теперь square() будет возвращать квадрат любого значения, с которым он вызывается. Иными словами, square()стал универсальным методом, который может вычислять квадрат любого целого значения, а не только 10. Например:

int x, у;

х = square (5); // х равно 25

х = square (9); // х равно 81

У = 2;

х = square (у); // х равно 4

Важно различать два термина параметр и аргумент. Параметр – это пере­менная, определяемая методом, которая принимает значение во время вызо­ва метода. Например, в методе square(int i) определен один параметр i типа int. Аргумент – это значение, которое передается методу, когда тот вызывается. Например, методу square (100) в качестве аргумента передается число 100.

Вы можете использовать параметризованный метод, чтобы улучшить класс Boх. В предыдущих примерах размеры каждого блока должны быть установ­лены отдельно при помощи последовательности следующих операторов:

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 BoxDemoS {

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-программирования.

Соседние файлы в папке JavaLit