Java для школьников. Занятие №6. Вникаем в ООП. Классы и методы. Нахождение объема параллелепипеда

Предыдущее занятие Следущее занятие

С чем познакомимся:

  • методы класса;
  • конструкторы;
  • конструктор по-умолчанию;
  • передача параметров в метод.

Продолжаем разбираться с классами на примере класса Box из прошлого занятия. На этом занятии мы поговорим о методах класса.

Начнем с того, что программисту-пользователю класса Box необходимо будет создавать в программах экземпляры класса Box со своими значениями длины, ширины и высоты параллелепипеда. А значит мы, как создатели класса, должны предусмотреть различные варианты создания экземпляров этого класса.

Также вполне возможно, что потребуется узнать объем параллелепипеда (ведь для чего-то этот класс нужен!). Таким образом, чтобы решить эти задачи, нам необходимо дополнить код из листинга прошлого занятия - см. Листинг 1.

Листинг 1. Класс Box с тремя полями типа "double", конструктором и методом getVolume() "вычислить объем"

import java.io.*;
public class Box {
 private double a, b, c ;
 Box() {
  a=0.0; b=0.0; c=0.0;
};
 public double getVolume (double x, double y, double z) {
  a=x; b=y; c=z;
  return a*b*c;
 }
 public static void main (String args []) {
    Box bx = new Box();
    System.out.println (bx.getVolume (4,2.5,3));
  }
}

Для компиляции программы достаточно сохранить данный листинг как файл Box.java и выполнить команду в терминале
javac Box.java
выполнение программы осуществляется командой (читайте об этом подробнее в материале Занятия №3)
java Box
вывод программы Box см. на рисунке 1
Вывод программы Box
Рисунок 1. Вывод программы Box


Как мы заставили нашу программу рассчитать объем параллелепипеда равный 30.0? Для этого мы наш класс снабдили методом (другими словами "определили в нем метод") getVolume()

... Обычно в тексте после названия метода ставятся скобки (как мы и написали - getVolume()), однако, не забывайте, что метод может принимать параметры, а может и не принимать (см. ниже конструктор Box()). В любом случае приглядывайтесь к описанию и реализации метода в программе.

public double getVolume (double x, double y, double z) {...}

Который, как говорят, "принимает три параметра" (или "аргумента"). Эти параметры записываются в поля класса Box "в теле" метода getVolume() с помощью оператора присваивания

a=x; b=y; c=z;

Отметим, что тело метода обрамляется парой фигурных скобок, т.е. представляет собой законченный блок кода. Итак метод в Java - это "способ сделать что-то" или "совершить полезную работу" (см. подробнее у Эккеля).

Если переменные a, b, c были определены как double и в памяти было отведено место для их хранения (для интереса, переменной double в Java отводится 64 разряда или бита) то присутствие ключевого слова double перед определением метода getVolume() требует объяснения. Говорят, что метод getVolume() "возвращает значение double" и в памяти, отводимой для экземпляра класса Box будет определено место для хранения этого значения. Возврат значения осуществляется с помощью оператора

return a*b*c;

где, в-общем-то, и рассчитывается объем параллелепипеда. Для вывода значения объема мы воспользовались уже известной нам записью - вызовом метода println класса System:

System.out.println (bx.getVolume (4,2.5,3));

Кстати, об операции точка (.) мы с вами уже говорили на предыдущем занятии. Как и при обращении к полю, операция точка (.) плюс название метода для экземпляра класса вызывает этот метод (в нашем случае getVolume() с параметрами 4, 2.5 и 3).

Выделение же памяти для объекта bx осуществляется с помощью оператора new в предшествующей строке:

Box bx = new Box();

В данном случае после оператора new следует метод, название которого совпадает с названием класса Box, а именно Box(). Такой метод в ООП называют "конструктором". Наш конструктор в классе Box не принимает никаких значений. Такой конструктор называется "конструктором по-умолчанию". И если попробовать скомпилировать нашу программу без него, то она завершится ошибкой. Еще бы, ведь в Java нет способов создавать объекты без оператора new и компилятор не знает чем заполнить память для объектов Box. В нашем случае при создании объекта с помощью конструктора по-умолчанию или, как его еще называют, "конструктора без параметров", все переменные экземпляра класса становятся равными нулю (см. тело конструктора), а все самое интересное и полезное происходит в методе getVolume() .

Аналогично, с помощью операции точка (.), вызывается метод println (если не считать того, что мы не создавали экземпляров класса System, но об этом поговорим чуть позже).

Наше занятие, честно говоря, оказалось не совсем законченным. Не было дано окончательного объяснения о работе метода main(), описанного в строке
public static void main (String args []) {...}
А также вместе с объясненным ранее ключевым словом public, которое было употреблено применительно к классу, мы достаточно вольно и без объяснения применили в объявлении переменных ключевое слово private, и об этом мы обязательно поговорим на следующем занятии.

Конечно, занятие получилось довольно сложным и его необходимо осмыслить. Однако, на данном этапе будет достаточно того, что мы получили рабочую программу для упражнений (действительно, попытайтесь самостоятельно вычислить объем параллелепипеда с другими значениями длины, ширины и высоты). А понимание, обязательно придет со временем! Итак, считаю, что на занятии мы познакомились с важными, с точки зрения ООП, понятиями, а именно:

  • с методами классов;
  • к тому, что описание класса (его определение) фактически является описанием распределения памяти для объектов этого класса, можно добавить: плюс описание полезных действий, необходимых для того, чтобы наш объект "ожил" (конструкторов и методов);
  • "что-то полезное" в программе на языке Java можно сделать с помощью методов (Методы, по определению Б.Эккеля, это функции объекта, которому вы посылаете сообщения, см. [1]);
  • и добавим: конструктор - это такой же метод, но с названием, повторяющим название класса. Конструктор просто необходим при создании экземпляров объектов.

Литература:
1. Брюс Эккель "Философия Java", 4-е издание, с.21