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


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

Добавление метода к классу Box



Создавать класс, который содержит только данные, случается редко. Чаще используют методы для доступа к экземплярным переменным, которые определены в классе. Методы определяют интерфейс с большинством классов. Они позволяют разработчику класса скрывать специфическое размещение внутренних структур данных за более ясными абстракциями метода. Кроме методов, которые обеспечивают доступ к данным, можно также определять методы, использующиеся внутри самого класса.

Так как объем блока зависит от его размера, то имеет смысл поручить это вычисление Box-классу. Добавим метод вычисления объема к Box-классу.:

 

// Эта программа включает метод внутрь класса Box.

class Box {

double width;

double height;

double depth;

// показать объем блока

void volume() {

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

System.out.println(width * height * depth);

}

}

class BoxDemo3 {

public static void main(String args[]) {

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() объекта mybox1. Точнее, она обращается к методу volume() объекта myboxl, используя имя объекта, за которым следует операция «точка». Таким образом, обращение к mybox2.volume() отображает объем блока, определенного переменной mybox1, а обращение к mybox2.volume() Отображает объем блока, определенного переменной mybox2.

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

Обратите внимание внутри метода volume(): переменные width, height и depth указаны прямо, без предшествующих им имен объектов и «точечных» операций. Когда метод использует переменную экземпляра, которая определена в его классе, он указывает ее прямо, без явной ссылки на объект и использования «точечной» операции. Метод всегда вызывается из некоторого объекта его класса. Раз этот вызов произошел, значит объект известен. Таким образом, внутри метода нет необходимости указывать объект второй раз. Это означает, что переменные width, height и depth внутри метода volume() неявно ссылаются на копии переменных, находящихся в объекте, который вызывает этот метод.

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

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

Хотя реализация метода 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().

 




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

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