Студопедия

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

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

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






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Статические элементы






     

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

    Для объявления статического члена класса, в том числе статического поля, ис­пользуется идентификатор 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.