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

Параметризованные конструкторы

Когда конструктор Box() в предшествующем примере инициализирует Bох-объект, это не очень полезно, потому что все блоки имеют одинаковые раз­меры. Необходим способ создания Box-объектов разных размеров. Простое решение состоит в добавлении параметров конструктора. Как вы можете, вероятно, предположить, это сделает его более полезным. Например, сле­дующая версия box определяет параметризованный конструктор, который устанавливает размеры блока с помощью своих параметров. Обратите особое внимание на то, как создаются Box-объекты.

/* Здесь класс Box использует параметризованный конструктор

для инициализации размеров блока. */

class Box {

double width;

double height;

double depth;

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

Box(double w, double h, double d) {

width = w;

height = h;

depth = d;

}

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

double volume() {

return width * height * depth;

}

}

class BoxDemo7 {

public static void main(String args[]) {

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

Box myboxl = new Box(10,20,15);

Box mybox2 = new Box(3,6,9);

double vol;

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

vol = myboxl.volume{);

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

// получить объем второго блока vol = mybox2.volume();

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

}

}

Вывод этой программы:

Объем равен 3000.0 Объем равен 162.0

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

Box myboxl = new Box(10, 20, 15);

значения 10, 20 и 15 передаются конструктору Box(), когда new создает объ­ект. Таким образом, копии переменных width, height и depth объекта myboxl будут содержать значения 10, 20 и 15, соответственно.

Ключевое слово this

Иногда у метода возникает необходимость обращаться к объекту, который его вызвал. Для этого Java определяет ключевое слово this. Его можно ис­пользовать внутри любого метода, чтобы сослаться на текущий объект. То есть this – это всегда ссылка на объект, метод которого был вызван. Вы можете использовать this везде, где разрешается ссылка на объект текущего класса.

Чтобы лучше понять, на что ссылается this, рассмотрим следующую версию Box():

// Избыточное использование this.

Box(double w, double h, double d) {

this.width = w;

this.height = h;

this.depth = d;

}

Эта версия Box() работает точно так же, как и более ранняя. Использование this избыточно, но совершенно корректно. Внутри Box() this будет всегда ссылаться на вызывающий объект. Хотя и избыточный в данном случае, this полезен в других контекстах, один из которых объясняется в следую­щем разделе.

Скрытие переменной экземпляра

Как известно, в Java недопустимо объявление двух локальных переменных с одним и тем же именем внутри той же самой или включающей области действия идентификаторов. Заметим, что вы можете иметь локальные пере­менные, включая формальные параметры для методов, которые перекрыва­ются с именами экземплярных переменных класса. Однако, когда локальная переменная имеет такое же имя, как переменная экземпляра, локальная пе­ременная скрывает переменную экземпляра. Вот почему width, height и depth не использовались как имена параметров конструктора box () внутри класса box. Если бы они были использованы для именования этих парамет­ров, то, скажем width, как формальный параметр, скрыл бы переменную экземпляра width. Хотя обычно проще указывать различные имена, сущест­вует другой способ обойти эту ситуацию. Поскольку this позволяет обра­щаться прямо к объекту, это можно применять для разрешения любых кон­фликтов пространства имен, которые могли бы происходить между экземплярными и локальными переменными. Ниже представлена другая версия box (), которая использует width, height и depth для имен параметров и за­тем применяет this, чтобы получить доступ к переменным экземпляра с те­ми же самыми именами:

// Используйте этот вариант конструктора для разрешения конфликтов пространства имен.

Box(double width, double height, double depth) {

this.width = width;

this.height = height;

this.depth = depth;

}

Предупреждение. Использование this в указанном контексте иногда может привести к путанице, так что некоторые программисты предпочитают не применять имена локальных переменных и формальных параметров, которые совпадают с переменными экземпляра. Конечно, другие программисты, наоборот, верят, что это хорошее соглашение (использовать одинаковые имена) для ясности, и this – что­бы преодолеть скрытие переменной экземпляра. Какой подход принимаете вы – это вопрос вкуса.

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