
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Параметризованные конструкторы
Когда конструктор Box() в предшествующем примере инициализирует Bох-объект, это не очень полезно, потому что все блоки имеют одинаковые размеры. Необходим способ создания Box-объектов разных размеров. Простое решение состоит в добавлении параметров конструктора. Как вы можете, вероятно, предположить, это сделает его более полезным. Например, следующая версия box определяет параметризованный конструктор, который устанавливает размеры блока с помощью своих параметров. Обратите особое внимание на то, как создаются Box-объекты.
/* Здесь класс Box использует параметризованный конструктор
для инициализации размеров блока. */
class Box {
double width;
double height;
double depth;
// Это конструктор класса Box.
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
// вычислить и возвратить объем
double volume() {
return width * height * depth;
}
}
class BoxDemo7 {
public static void main(String args[]) {
// объявить, распределить и инициализировать Box-объекты
Box myboxl = new Box(10,20,15);
Box mybox2 = new Box(3,6,9);
double vol;
// получить объем первого блока
vol = myboxl.volume{);
System.out.println("Объем равен " + vol);
// получить объем второго блока vol = mybox2.volume();
System.out.println("Объем равен " + vol);
}
}
Вывод этой программы:
Объем равен 3000.0 Объем равен 162.0
Не трудно обнаружить, что каждый объект инициализирован так, как определено в параметрах его конструктора. Например, в следующей строке
Box myboxl = new Box(10, 20, 15);
значения 10, 20 и 15 передаются конструктору Box(), когда new создает объект. Таким образом, копии переменных width, height и depth объекта myboxl будут содержать значения 10, 20 и 15, соответственно.
Ключевое слово this
Иногда у метода возникает необходимость обращаться к объекту, который его вызвал. Для этого Java определяет ключевое слово this. Его можно использовать внутри любого метода, чтобы сослаться на текущий объект. То есть this – это всегда ссылка на объект, метод которого был вызван. Вы можете использовать this везде, где разрешается ссылка на объект текущего класса.
Чтобы лучше понять, на что ссылается this, рассмотрим следующую версию Box():
// Избыточное использование this.
Box(double w, double h, double d) {
this.width = w;
this.height = h;
this.depth = d;
}
Эта версия Box() работает точно так же, как и более ранняя. Использование this избыточно, но совершенно корректно. Внутри Box() this будет всегда ссылаться на вызывающий объект. Хотя и избыточный в данном случае, this полезен в других контекстах, один из которых объясняется в следующем разделе.
Скрытие переменной экземпляра
Как известно, в Java недопустимо объявление двух локальных переменных с одним и тем же именем внутри той же самой или включающей области действия идентификаторов. Заметим, что вы можете иметь локальные переменные, включая формальные параметры для методов, которые перекрываются с именами экземплярных переменных класса. Однако, когда локальная переменная имеет такое же имя, как переменная экземпляра, локальная переменная скрывает переменную экземпляра. Вот почему width, height и depth не использовались как имена параметров конструктора box () внутри класса box. Если бы они были использованы для именования этих параметров, то, скажем width, как формальный параметр, скрыл бы переменную экземпляра width. Хотя обычно проще указывать различные имена, существует другой способ обойти эту ситуацию. Поскольку this позволяет обращаться прямо к объекту, это можно применять для разрешения любых конфликтов пространства имен, которые могли бы происходить между экземплярными и локальными переменными. Ниже представлена другая версия box (), которая использует width, height и depth для имен параметров и затем применяет this, чтобы получить доступ к переменным экземпляра с теми же самыми именами:
// Используйте этот вариант конструктора для разрешения конфликтов пространства имен.
Box(double width, double height, double depth) {
this.width = width;
this.height = height;
this.depth = depth;
}
Предупреждение. Использование this в указанном контексте иногда может привести к путанице, так что некоторые программисты предпочитают не применять имена локальных переменных и формальных параметров, которые совпадают с переменными экземпляра. Конечно, другие программисты, наоборот, верят, что это хорошее соглашение (использовать одинаковые имена) для ясности, и this – чтобы преодолеть скрытие переменной экземпляра. Какой подход принимаете вы – это вопрос вкуса.