Главная страница

Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


Скачать 1.76 Mb.
НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Дата12.03.2021
Размер1.76 Mb.
Формат файлаdoc
Имя файлаOOP_Lab_Rus.doc
ТипЛабораторная работа
#184105
страница9 из 31
1   ...   5   6   7   8   9   10   11   12   ...   31

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-программирования.
1   ...   5   6   7   8   9   10   11   12   ...   31


написать администратору сайта