
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Представление методов
Как упоминалось в начале этого раздела, классы обычно состоят из двух видов компонент – переменных экземпляра и методов. Общая форма метода такова:
type name(parameter-list) {
// тело метода
}
Здесь type определяет тип данных, возвращаемых методом. Это может быть любой допустимый тип, включая типы классов. Если метод не возвращает значения, его возвращаемый тип должен быть void. Именем (name) метода может быть любой допустимый идентификатор, но отличающийся от тех, что уже используются другими элементами в пределах текущей области действия имен. Рarameter-list – это последовательность пар тип-идентификатор, разделенных запятыми. Параметры – это, по существу, переменные, которые принимают значения аргументов, посылаемых методу во время его вызова. Если метод не имеет параметров, то список параметров будет пуст.
Методы, у которых тип возвращаемого значения отличен от void, возвращают значение вызывающей подпрограмме, используя оператор return в форме return value, где value – возвращаемое значение.
Добавление метода к классу Box
Методы обычно определяют поведение объекта и обеспечивают доступ к экземплярным переменным, которые определены в классе. Фактически, именно методы определяют интерфейс с большинством классов. Они позволяют разработчику класса скрывать специфическое размещение внутренних структур данных за более ясными абстракциями метода.
Оценивая предыдущие программы, можно отметить, что вычисление объема блока было бы лучше выполнять в Box-классе, а не в классе BoxDemo, хотя бы потому, что объем блока зависит от его размеров, а размеры определены в Вох-классе. Для этого нужно добавить метод в класс Вох:
// Эта программа включает метод внутрь класса-Box.
class Box {
double width;
double height;
double depth;
// показать объем блока
void volume () {
System.out.println ("Объем равен " + width*height*depth);
}
}
class ВохDemoЗ {
public static void main (String args[]) {
Box myboxl = new Box();
Box mybox2 = new Box();
// присвоить значения переменным экземпляра mybox1
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
Рассмотрим подробнее две следующие строки программы:
mybox1.volume () ;
mybox2.volume () ;
Первая строка включает метод volume() объекта mybox1. Точнее, она обращается к методу volume() объекта mybox1, используя имя объекта, за которым следует "точка". Таким образом, обращение к mybox1.volume() отображает объем блока, определенного переменкой mybox1, а обращение к mybox2.volume() отображает объем блока, определенного переменной mybox2.
В общем случае метод – это способ реализации подпрограмм в языке Java. Когда выполняется myboxl.volume(), исполняющая система Java передает управление коду, определенному внутри метода volume(). После того как операторы внутри volume() выполнятся, управление возвращается в вызывающую программу, и передается строке кода, следующей за вызовом.
При этом следует обратить внимание на то, что внутри метода volume(): переменные width, height и depth указаны без предшествующих им имен объектов и "точечных" операций. Иными словами, когда метод использует переменную экземпляра, которая определена в его классе, он указывает ее прямо, без явной ссылки на объект и использования "точечной" операции. Это возможно, так как метод всегда вызывается из некоторого объекта его класса, т.е. объект известен и внутри метода нет необходимости указывать объект второй раз. Это означает, что переменные width, height и depth внутри метода volume () неявно ссылаются на копии переменных, находящихся в объекте, который вызывает этот метод.
Итак, когда к переменной экземпляра обращается код, который не является частью класса, в котором данная переменная определена, это должно быть сделано через объект, при помощи "точечной" операции. Однако, когда к такой переменной обращается код, являющийся частью ее класса, на эту переменную можно ссылаться прямо (т. е. без квалификации ее имени именем объекта). Этот же принцип относится и к методам.