Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Статические элементы






 

Как уже отмечалось, помимо обычных полей и методов, в классе могут быть ста­тические члены. От нестатических членов статические принципиально отлича­ются тем, что они общие для всех объектов данного класса. Например, если речь идет о нестатическом поле, то у каждого объекта класса это поле имеет свое уни­кальное для объекта значение. Если поле является статическим, то у всех объ­ектов значение этого поля одно и то же. В некотором смысле статические поля напоминают глобальные переменные языка С++, хотя аналогия достаточно натя­нутая. Со статическими методами ситуация несколько сложнее, поэтому сначала рассмотрим особенности объявления и использования статических полей.

Для объявления статического члена класса, в том числе статического поля, ис­пользуется идентификатор static. Синтаксис описания статического поля сле­дующий:

static тип_поля имя_поля;

Перед ключевым словом static также может следовать спецификатор доступа к полю (см. далее в этой главе). Инициализация значения статического поля выполняется в специальном статическом блоке. Статический блок также вы­деляется ключевым словом static, после которого в фигурных скобках следуют команды инициализации статических полей класса. Статический блок не явля­ется обязательным. Синтаксис описания статического блока такой:

static{ // начало статического блока

// статический блок

} // завершение статического блока

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

Статические методы класса от обычных отличаются в первую очередь тем, что могут обращаться только к статическим полям класса. Причина достаточно оче­видна: метод, который не связан с конкретным экземпляром класса, может, есте­ственно, оперировать с полями, тоже не связанными с конкретным экземпляром, поскольку действие метода должно затрагивать сразу все объекты, относящиеся к классу. Кроме того, в статических методах недопустимо использование клю­чевых слов this (ссылка на экземпляр класса, из которого вызывается метод) и super (ссылка на экземпляр суперкласса, на основе которого создан вызываю­щий метод производный класс). Причина та же, что и в первом случае.

Объявляется статический метод так же, как и статическое поле. В частности, в сигнатуре метода указывается ключевое слово static:

static тип_результата имя_метода(список аргументов){

// тело метода

}

Вызов статического метода вне класса, в котором он описан, осуществляется в формате имя_класса.имя_метода. В листинге 4.2 приведен пример объявления и использования статических полей и статического метода.

 

Листинг 4.2. Класс со статическими элементами

class UsingStatic{

// Статические поля:

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; }

продолжение

Листинг 4.2 (продолжение)

// Вызов статического метода:

public static void main(String args[]){

meth(123);

}

}

В классе UsingStatic описано два статических поля a и b типа int и статиче­ский метод meth(). Для статического поля a указано значение 3. Статическое поле b значением не инициализировано. Инициализация этого поля выполня­ется в статическом блоке командой b=a*4, причем предварительно выводится сообщение Статический блок.

Статический метод meth() результат не возвращает. Ему передается целочислен­ный аргумент. Действие метода состоит в последовательном выводе сообщения со значениями аргумента метода и статических полей класса.

В этом же классе UsingStatic описан метод main(), в котором всего одна команда вызова метода meth() с аргументом 123. Обращаем внимание, что поскольку статический метод вызывается из того же класса, в котором он описан, для вы­зова метода достаточно указать его имя. В результате выполнения программы мы получим следующее:

Статический блок:

x=123

a=3

b=12

Выполнение статического блока происходит при загрузке программного кода класса, поэтому еще до вызова метода meth() в главном методе программы стати­ческая переменная b получает значение благодаря предварительному выполне­нию команд статического блока. Еще один пример использования статических элементов приведен в листинге 4.3.

 

Листинг 4.3. Использование статических элементов

class MyStatic{

// Статические поля:

static int a=50;

static int b=120;

// Статический метод:

static void callme(){

System.out.println(" a=" +a);

}}

// Использование статических элементов:

class StaticDemo{

public static void main(String args[]){

// Вызов статического метода через класс:

MyStatic.callme();

// Объекты класса:

MyStatic obj1=new MyStatic();

MyStatic obj2=new MyStatic();

// Вызов статического поля через объект: obj1.a=-25;

// Вызов статического поля через объект:

System.out.println(" a=" +obj2.a);

// Вызов статического поля через класс:

System.out.println(" b=" +MyStatic.b);

}}

Результатом выполнения программы является следующая серия сообщений:

a=50

a=-25

b=120

В данном случае описано два класса. В классе MyStatic описаны два статических целочисленных поля a и b с предопределенными значениями 50 и 120 соот­ветственно. Кроме того, в классе описан статический метод callme(). Метод не имеет аргументов и не возвращает результат, а его действие состоит в выводе значения статического поля a. В главном методе программы в классе StaticDemo создается два объекта obj1 и obj2 класса MyStatic. Однако предварительно с по­мощью команды MyStatic.callme() вызывается метод callme(). Другими словами, статический метод вызывается еще до того, как созданы объекты класса — в них для вызова статического метода или обращения к статическому полю нет не­обходимости. Далее командой obj1.a=-25 полю a присваивается новое значение. Формально в данном случае речь идет о поле объекта obj1, но поскольку поле статическое, то эффект «глобальный». В этом несложно убедиться, проверив ре­зультат выполнения команды System.out.println(" a=" +obj2.a). Наконец, пример обращения к статическому полю через ссылку на класс представлен командой System.out.println(" b=" +MyStatic.b).

Хочется особо обратить внимание на несколько важных обстоятельств. Так, в приведенном примере отсутствует статический блок. Обращение к статиче­ским элементам выполняется как через ссылку на класс, так и через ссылки на конкретные экземпляры класса. В последнем случае изменение значения поля для одного объекта означает такое же изменение этого поля для прочих объек­тов (на самом деле речь идет об одном общем для всех объектов поле). Кроме того, для использования статических элементов вообще нет необходимости со­здавать экземпляры класса (объекты).

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.