Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

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



Хотя некоторые методы не нуждаются в параметрах, но большинство из них параметрами все-таки пользуется. Параметры обобщают метод. Параметризованный метод может работать на множестве данных и/или использоваться в ряде похожих ситуаций. Чтобы иллюстрировать это положение, воспользуемся очень простым примером. Имеется метод, который возвращает квадрат числа 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-программирования.

Конструкторы

При создании экземпляров весьма утомительно инициализировать все переменные в классе. Даже, когда вы добавляете функции для организации удобств, подобные setDimo, было бы проще и быстрее делать всю установку во время первоначального создания объекта. Поскольку требования инициализации являются достаточно общими, Java разрешает инициализацию объектов в момент их создания. Эта автоматическая инициализация выполняется с помощью конструктора.

Конструктор инициализирует объект после его создания. Он имеет такое же имя, как класс, в котором он постоянно находится и синтаксически подобен методу. Если конструктор определен, то он автоматически вызывается сразу же после того, как объект создается, и прежде, чем завершается выполнение операции new. Конструкторы выглядят немного странными, потому что не имеют ни спецификатора возвращаемого типа, ни даже спецификатора void. Происходит это от того, что неявным возвращаемым типом конструктора класса является тип самого класса. Работа конструктора заключается в том, чтобы инициализировать внутреннее состояние объекта так, что код, создающий экземпляр, будет полностью инициализирован и пригоден для немедленного использования объекта.

Можно переделать пример Box таким образом, чтобы размеры блока были автоматически инициализированы во время построения объекта. Для этого следует заменить метод setDim() конструктором. Начнем с определения простого конструктора, который устанавливает одинаковые значения для размеров каждого блока:

/*

Box использует конструктор для инициализации размеров блока.

*/

class Box {

double width;

double height;

double depth;

 

// Это конструктор класса Box.

Box() {

System.out.println("Создание Box");

width = 10;

height = 10;

depth =10;

}

 

// вычислить и возвратить объем

double volume() {

return width * height * depth;

}

}

class BoxDemo6 {

public static void main(String args [] ) {

// объявить, разместить в памяти и инициализировать Вох-объекты

Box myboxl = new Box();

Box mybox2 = new Box();

double vol;

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

vol = myboxl.volume();

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

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

vol = mybox2.volume();

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

}

}

 

Когда эта программа выполняется, она генерирует следующие результаты:

 

Создание Box

Создание Box

Объем равен 1000.0

Объем равен 1000.0

 

Вы видите, что myboxl и mybox2 были инициализированы конструктором Box() во время их создания. Так как конструктор дает всем блокам одинаковые размеры, 10x10x10, myboxl и mybox2 будут иметь один и тот же объем. Предложение printin() внутри Box() приводится только ради иллюстрации. Большинство функций конструктора ничего не будет отображать. Они просто инициализируют объект.

Прежде чем двигаться дальше, давайте повторно рассмотрим операцию new. Как вы знаете, при распределении (в памяти) объекта, нужно использовать следующую общую форму:

 

Class-var = new classname();

 

Теперь вы можете понять, почему необходимы круглые скобки после имени класса. Фактически выполняется вызов конструктора класса. Таким образом, правая часть операции присваивания в строке

 

Box myboxl = new Box();

 

есть вызов конструктора Box(). Если вы явно конструктор класса не определяете, то Java создает для этого класса конструктор по умолчанию (default constructor). Вот почему предшествующая строка программы работала в более ранних версиях Box, где конструктор не был определен. Умалчиваемый конструктор автоматически инициализирует все переменные экземпляра нулями. Такой конструктор часто достаточен для простых классов, но не для более сложных. Как только в классе определяется собственный конструктор, умалчиваемый больше не используется.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.