
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Возврат значений
Хотя реализация метода 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 &rgs[]) {
Box myboxl = new Box();
Box mybox2 = new Box ();
double vol;
// присвоить значения переменным экземпляра mybox1
myboxl.width = 10;
myboxl.height = 20;
myboxl.depth = 15;
/* присвоить другие значения переменным экземпляра niybox2
rnybox2. width = 3;
mybox2.height = 6;
mybox2.depth = 9;
// получить объем первого блока
vol = myboxl.volume();
System.out.println("Объем равен " + vol);
// получить объем второго блока
vol = mybox2.volume();
System.out.println("Объем равен " + vol);
}
}
He трудно заметить, что при вызове метода volume() он помещается справа от оператора назначения (присваивания). Слева находится переменная, в данном случае это переменная vol, которая примет значение, возвращенное методом volume(). Таким образом, после выполнения оператора
vol = myboxl.volume();
значение myboxl.volume() становится равным 3000, и это значение затем сохраняется в vol. Еще два важных замечания относительно возвращения значений:
-
тип данных, возвращаемых методом, должен быть совместим с типом, указанным в заголовке определения метода. Например, если тип возвращаемого значения некоторого метода – boolean, вы не можете возвращать целое число типа int;
-
переменная, принимающая значение, возвращаемое методом (такая, как vol в нашем случае), должна также быть совместима с типом возвращаемого значения, указанным в определении метода.
Еще одно замечание: предшествующая программа может быть записана немного эффективнее, потому что нет фактически никакой потребности в переменной vol. Обращение к volume() можно выполнить прямо в утверждении с вызовом println(), например:
System.out.println("Объем равен " + mybox1.volume());
В этом случае при выполнении println() метод mybox1.volume() будет вызываться автоматически, и его значение будут пересылаться в println().
Добавление метода с параметрами
Хотя некоторые методы не нуждаются в параметрах, но большинство из них параметрами все-таки пользуется. Параметры обобщают метод. Параметризованный метод может работать на множестве данных и/или использоваться в ряде похожих ситуаций. Чтобы иллюстрировать это положение, воспользуемся очень простым примером. Имеется метод, который возвращает квадрат числа 10:
int square() {
return 10 * 10;
}
Хотя этот метод действительно осуществляет возврат значения 10, возведенного в квадрат, его использование очень ограничено. Однако если изменить метод так, чтобы он имел параметр, как показано ниже, он окажется более полезным.
int square (int i) {
return i * i;
}
Теперь square() будет возвращать квадрат любого значения, с которым он вызывается. Иными словами, square()стал универсальным методом, который может вычислять квадрат любого целого значения, а не только 10. Например:
int x, у;
х = square (5); // х равно 25
х = square (9); // х равно 81
У = 2;
х = square (у); // х равно 4
Важно различать два термина параметр и аргумент. Параметр – это переменная, определяемая методом, которая принимает значение во время вызова метода. Например, в методе square(int i) определен один параметр i типа int. Аргумент – это значение, которое передается методу, когда тот вызывается. Например, методу square (100) в качестве аргумента передается число 100.
Вы можете использовать параметризованный метод, чтобы улучшить класс Boх. В предыдущих примерах размеры каждого блока должны быть установлены отдельно при помощи последовательности следующих операторов:
myboxl.width = 10;
myboxl.height = 20;
myboxl.depth = 15;
Хотя этот код работает, однако возникает некоторое беспокойство. Во-первых, он кажется каким-то не изящным и склонным к ошибкам. Например, легко забыть установку измерений. Во-вторых, в хорошо разработанных Java-программах к переменным экземпляра нужно обращаться только через методы, определенные их классом. В будущем вы сможете изменять поведение метода, но вы не можете изменять поведение установленной переменной экземпляра.
Таким образом, лучший подход к установке размеров блока состоит в том, чтобы создать метод, который берет измерения блока в свои параметры и походящим образом устанавливает каждую переменную экземпляра. Эта концепция реализована следующей программой:
// Эта программа использует параметризованный метод.
class Box {
double width;
double height;
double depth;
// вычислить и возвратить объем
double volume () {
return width * height * depth;
}
// установить размеры блока
void setDim(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
}
class BoxDemoS {
public static void main(String args[]) {
Box myboxl = new Box();
Box mybox2 = new Box();
double vol;
// инициализировать каждый блок
myboxl.setDim(10, 20, 15);
mybox2.setDim(3, 6, 9);
// получить объем первого блока
vol = myboxl.volume();
System.out.println("Объем равен " + vol);
// получить объем второго блока
vol = mybox2.volume();
System.out.println("Объем равен " + vol);
}
}
Как можно заметить, метод setDim() используется, чтобы установить размеры каждого блока. Например, когда
myboxl. setDim (10, 20, 15);
выполняется, 10 копируется в параметр w, 20 копируется в h и 15 копируется в d. Внутри метода setDim() значения w, h и d затем назначаются переменным width, height И depth, соответственно.
Для многих читателей – особенно тех, кто имеет некоторый опыт программирования в C/C++ – концепции, представленные в предшествующих разделах, конечно знакомы. Однако если такие понятия, как вызовы метода, аргументы и параметры являются для вас новыми, то, прежде чем двигаться дальше, желательно потратить некоторое время на эксперименты. Концепции вызова метода, параметры и возврат значений фундаментальны для Java-программирования.