Воскресенье
20.09.2020
07:26


Форма входа


Приветствую Вас Гость | RSS
Статьи по ORACLE, PL/SQL, Java и немного по SHELL (BASH),...
Главная Каталог статей Регистрация Вход
Главная » Статьи » Java приложения » Java

static и final
Статические элементы
    Иногда возникает необходимость определить элемент (член) класса так, чтобы появилась возможность пользоваться им независимо от какого-либо объекта этого класса. Обычно к элементам класса нужно обращаться только через объект этого класса. Однако можно создать элемент для использова­ния без ссылки на определенный объект. Чтобы это сделать, укажите в на­чале его объявления ключевое слово 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("meth");
    System.out.println("x = " + x);
    System.out.println("a = " + a);
    System.out.println("b = " + b);
  }

  static {
    System.out.println("static");
    System.out.println("Статический блок инициализирован.");
    b = a * 4;
  }

  public static void main(String[] args) {
    System.out.println("main");
    meth(42);
  }
}

    Bсe static-инструкции выполняются сразу же после загрузки класса UseStatic. Сначала, в а устанавливается 3, затем выполняется static-блок (печатая сообщения), и наконец, b инициализируется значением а * 4 или 12. Затем вызывается метод main о, который обращается к metho, передавая 42 параметру х. Три оператора println о обращаются к двум static-перемен­ным (а и b) и  к локальной переменной x.

Вывод этой программы:
static
Статический блок инициализирован.
main
meth
x = 42
a = 3
b = 12
 
    Вне класса, в котором они определены, статические методы и переменные могут использоваться независимо от любого объекта. В этом случае для об­ращения к ним используются имена их класса и точечная операция. На­пример, если нужно вызвать static-метод вне его класса, можно воспользо­ваться следующей общей формой вызова:

classname.methodname()

    Здесь classname — имя класса, в котором объявлен static-метод; methodname — имя статического метода. Нетрудно заметить, что этот формат подобен вызову нестатических методов через переменные, ссылающиеся на объект. К переменной static можно обращаться таким же образом — при помощи точечной операции с именем класса (в качестве левого операнда). Так Java реализует управляемую версию глобальных функций и глобальных переменных.

Например:

class StaticDemo {
  static int a = 42;
  static int b = 99;
  static void callme() {
    System.out.println("a = " + a);
  }
}

public class StaticByName {
  public static void main(String[] args) {
    StaticDemo.callme();
    System.out.println("b = " + StaticDemo.b);
  }
}

Здесь внутри метода main() к статическому методу callme() и статической переменной b обращаются вне их класса.

Вывод этой программы:

a = 42
b = 99

    Спецификатор final
    Переменную можно объявить как final, предохраняя ее содержимое от из­менения. Это означает, что нужно инициализировать final-переменную, когда она объявляется. Например:

public class FinaDemol {
  public static void main(String[] args) {
    final int FILE_NEW = 1;
    final int FILE_OPEN = 2;
    final int FILE_SAVE = 3;
    final int FILE_SAVEAS = 4;
    final int FILE_QUIT = 5;
    //FILE_NEW = 8; // Выдает сообщение о невозможности назначить переменной значение
  }
}

    После таких объявлений последующие части программы могут использовать FILE_NEW и т. д., как константы, без опасения, что их значения были изме­нены.
    Общее соглашение кодирования для final-переменных — выбирать все идентификаторы в верхнем регистре. Переменные, объявленные как final, не занимают память на "поэкземплярной" основе. Таким образом, final- переменная — по существу константа.
    Ключевое слово final может также применяться и с методами, но его на­значение в этом случае существенно отличается от применяемого в пере­менных.
    Применение final в методах свя­заны с наследованием (для отказа от переопределения и для отмены наследования)
Категория: Java | Добавил: Akarak (07.10.2011)
Просмотров: 15067 | Комментарии: 2 | Рейтинг: 5.0/1
Всего комментариев: 2
0
2 Akarak   [Материал]
Да господин Шилд, это Ваше. Не претендую на Ваши труды. Спасибо что нашли мой сайт на просторах сети. Как только у меня будет пара часов свободного времени, на всех страницах укажу ссылку на Вас.

0
1 Г. Шилдт   [Материал]
Из книги Г. Шилдт "Java. Полное руководство"

Имя *:
Email *:
Код *:
Меню сайта

Категории раздела
Java [12]
Консольные приложения
Java ООП [2]

Интересные сайты
  • sql.ru
  • all-oracle.ru
  • oranet.ru
  • oracloid.ru
  • forum.vingrad.ru

  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Поиск

    Copyright MyCorp © 2020
    Используются технологии uCoz