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

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

Теперь приступим к добавлению метода в класс Box. Просматривая предшествующие программы, легко прийти к выводу, что класс Box мог бы лучше справиться с вычислением объема параллелепипеда, чем класс BoxDemo. В конце концов, поскольку объем параллелепипеда зависит от его размеров, вполне логично, чтобы его вычисление выполнялось в классе 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 (), определенному в myboxl. То есть она вызывает метод volume () по отношению к объекту myboxl, для чего было использовано имя объекта, за которым следует символ операции точки. Таким образом, обращение к myboxl .volume () отображает объем параллелепипеда, определенного объектом myboxl, а обращение к mybox2 .volume () — объем параллелепипеда, определенного объектом mybox2. При каждом вызове метода volume () он отображает объем указанного параллелепипеда.

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

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

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