
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Статические элементы
Иногда возникает необходимость определить элемент (член) класса так, чтобы появилась возможность пользоваться им независимо от какого-либо объекта этого класса. Обычно к элементам класса нужно обращаться только через объект этого класса. Однако можно создать элемент для использования без ссылки на определенный объект. Чтобы это сделать, укажите в начале его объявления ключевое слово static. Когда элемент объявляется как static, к нему можно обращаться до того, как создаются какие-либо объекты его класса, и без ссылки на какой-либо объект. Статическими можно объявлять как методы, так и переменные. Наиболее общим примером static-элемента является метод main(). Он объявляется как static, потому что должен вызваться прежде, чем будут созданы какие-либо объекты.
Переменные экземпляра, объявленные как static, это, по существу, глобальные переменные. Когда создаются объекты их класса, никакой копии static-переменной не делается. Вместо этого, все экземпляры класса совместно используют (разделяют) одну и ту же static-переменную.
Методы, объявленные как static имеют несколько ограничений:
-
могут вызывать только другие static-методы;
-
должны обращаться только к static-данным;
-
никогда не могут ссылаться на this или super. (Ключевое слово super касается наследования и описано в следующей главе.)
Для организации вычислений с целью инициализировать статические переменные можно объявить статический блок, который выполняется только один раз, когда класс впервые загружается. Следующий пример демонстрирует класс, который имеет статические методы, несколько переменных и блок инициализации:
// Демонстрирует статические переменные, методы и блоки,
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b) ;
}
static { . '
System.out.println("Статический блок инициализирован."); b = a * 4;
}
public static void main(String argst]) {
meth(42);
}
}
Bee static-инструкции выполняются сразу же после загрузки класса Usestatic. Сначала, в а устанавливается 3, затем выполняется static-блок (печатая сообщения), и наконец, ь инициализируется значением ам или 12. Затем вызывается метод main ( ) , который обращается к meth ( ) , передавая 42 параметру х. Три оператора println о обращаются к двум static-переменным (а и ь) и к локальной переменной х.
Внутри статического метода недопустимо обращаться к любым зкземплярным переменным.
Вывод этой программы:
Статический блок инициализирован, х = 42 а = 3 b = 12
Вне класса, в котором они определены, статические методы и переменные могут использоваться независимо от любого объекта. В этом случае для обращения к ним используются имена их класса и точечная операция. Например, если нужно вызвать static-метод вне его класса, можно воспользоваться следующей общей формой вызова:
classname.methodname()
Здесь ciassname – имя класса, в котором объявлен static-метод; methodname – имя статического метода. Нетрудно заметить, что этот формат подобен вызову нестатических методов через переменные, ссылающиеся на объект. К переменной static можно обращаться таким же образом – при помощи точечной операции с именем класса (в качестве левого операнда). Так Java реализует управляемую версию глобальных функций и глобальных переменных.
Например:
class StaticDemo {
static int a = 42;
static int b = 99;
static void- callmeO {
System.out.println("a = " + a) ;
} - .
}
class StaticByName {
public static void main(String args[]) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo,b);
}
}
Здесь внутри метода main() к статическому методу callme () и статической переменной ь обращаются вне их класса.
Вывод этой программы:
а = 42 b = 99