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

Глава 6. Введение в классы 143

Box myboxl = new Box(); Box mybox2 = new Box();

// присвоить значения переменным экземпляра myboxl myboxl.width = 10; myboxl.height = 20; myboxl.depth = 15;

/* присвоить другие значения

переменным экземпляра mybox2 */ mybox2.width = 3; mybox2.height = 6; mybox2.depth = 9 ;

// показать объем первого блока myboxl.volume ();

// показать объем второго блока mybox2.volume (); } }

Эта программа генерирует следующий вывод, который является таким же, как в предыдущей версии.

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

Рассмотрим подробнее две следующие строки программы:

myboxl . volume (); mybox2 . volume ( ) ;

Первая строка включает метод volume о объекта myboxl. Точнее, она обраща­ется к методу volume о объекта myboxl, используя имя объекта, за которым следует операция "точка". Таким образом, обращение к myboxl. volume о ото­бражает объем блока, определенного переменной myboxl, а обращение к mybox2 . volume о отображает объем блока, определенного переменной mybox2.

Если вы не знакомы с концепцией вызова метода, следующее обсуждение поможет прояснять данный вопрос. Когда выполняется myboxl . volume ( ) , исполняющая система Java передает управление коду, определенному внут­ри метода volume о. После того как операторы внутри volume о выполнятся, управление возвращается в вызывающую подпрограмму, и работа продолжа­ется со строки кода, следующей за вызовом. В самом общем смысле ме­тод — это способ реализации подпрограмм в языке Java.

Есть кое-что очень важное, на что нужно обратить внимание внутри метода volume о: переменные width, height и depth указаны прямо, без предшест­вующих им имен объектов и "точечных" операций. Когда метод использует

144 Часть I. Язык Java

переменную экземпляра, которая определена в его классе, он указывает ее прямо, без явной ссылки на объект и использования "точечной" операции. Понять это достаточно просто, если немного подумать. Действительно, ме­тод всегда вызывается из некоторого объекта его класса. Раз этот вызов произошел, значит объект известен. Таким образом, внутри метода нет не­обходимости указывать объект второй раз. Это означает, что переменные width, height и depth внутри метода volume о неявно ссылаются на копии переменных, находящихся в объекте, который вызывает этот метод.

Итак, когда к переменной экземпляра обращается код, который не является частью класса, в котором данная переменная определена, это должно быть сделано через объект, при помощи "точечной" операции. Однако, когда к такой переменной обращается код, являющийся частью ее класса, на эту переменную можно ссылаться прямо (т. е. без квалификации ее имени име­нем объекта). Этот же принцип относится и к методам.

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

Хотя реализация метода volume () перемещает вычисление объема блока внутрь Box-класса, которому этот метод принадлежит, это — не лучший спо­соб вычисления. Например, что если другая часть вашей программы захоте­ла просто узнать объем блока, но не отображать его значения? Лучший спо­соб реализации метода volume () состоит в том, чтобы он вычислял объем блока и возвращал результат вызывающей программе. Следующий пример (улучшенная версия предшествующей программы) именно это и делает:

// Теперь volume() возвращает объем блока.

class Box { double widths-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;

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