4.1 Статические члены класса

4.1 Статические члены класса

Модификатор static может использоваться переменной, методом или блоком кода. Статическая переменная или метод или блок кода в классе - не определенный для конкретного экземпляра, который вызывается с помощью имени класса и нет никакой потребности создавать объект класса, чтобы обратиться к статическому члену класса.

4.1.1 Атрибуты static

Статические переменные - переменные, созданные с ключевым словом 'static'. К статическим переменным класса обращаются только статические методы. Есть только одна копия статической области на класс - независимо от того, сколько экземпляров класса создано.
Следующий пример показывает простой класс с единственной статической переменной:
class StaticDemo
{
static int x = 0;
StaticDemo()
       {
x++ ;
       }
}


Переменная x является статической; это означает, что есть только одна переменная х, независимо от того, сколько экземпляров класса StaticDemo могло бы существовать. Возможно существование нескольких экземпляров класса StaticDemo, или одного, или даже не одного; существует точно одна переменная х. Четыре байта памяти, занятой х распределены, когда загружен класс StaticDemo. Инициализация к нолю также происходит во время загрузки класса. Статическая переменная увеличивается каждый раз, когда вызывается конструктор, так что можно узнать, сколько случаев создания было.

Есть два пути ссылки на статическую переменную:
Через ссылку на любой экземпляр класса
Через имя класса

Первый метод может кончиться запутывающим кодом и рассматривается как некорректность. Следующий пример показывает почему:

StaticDemo d1 = new StaticDemo();
StaticDemo d2 = new StaticDemo();
d1.x = 100 ;
d2.x = 200;
testVariable = d1.x;

В вышеупомянутом коде, если бы мы не знали, что х является статическим, мы могли бы подумать, что testVariable равно 100 на пятой строчке кода. Фактически, она равна 200, потому что d1.x и d2.x обращаются к одной и той же (статической) переменной.

Лучший способ обратиться к статической переменной - через имя класса. Следующий код идентичен коду выше:
StaticDemo d1 = new StaticDemo();
StaticDemo d2 = new StaticDemo();
StaticDemo.x = 100;
StaticDemo.x = 200;
testVariable = StaticDemo.x;

Теперь ясно, что строчка 3 кода является бесполезной, и значение testVariable установлено на 200 в строчке 5.

Следующий пример показывает, как можно обратиться к статической переменной класса.

Пример 1:
class StaticModifier
{
static int i = 10;
int j ;
StaticModifier()
       {
j =20;
       }
}
public class StaticDemo
{
public static void main(String args[])
       {
System.out.println( Static variable i = +StaticModifier.i);
StaticModifier s = new StaticModifier();
System.out.println( Instance variable j = +s.j);
       }
}


Вывод вышеупомянутой программы:

Рисунок 4.1: Результат


В вышеупомянутой программе, обращаются к статической переменной i, не создавая объект класса. Это происходит потому, что только одна копия статических переменных создана на весь класс, и следовательно к ней можно обратиться с именем класса.

Обратите внимание: Мы можем обращаться к статическим переменным с объектами, но нет никакого значения в выполнении, потому что значение, содержавшееся в статической переменной, является одним и тем же для всех объектов.

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

Java обеспечивает 'статические' методы, которые определяются в описании класса и к ним можно обращаться, не создавая экземпляр класса.

Статическую переменную или метод также называют переменной класса или методом, так как она принадлежит непосредственно классу, а не экземпляру этого класса.

Статический метод не может быть отменен, чтобы быть нестатическим. Код ниже, например, не будет откомпилирован:
class StaticTest
{
static void test() { }
}

class Staticex extends StaticTest
{
void test () {}
}


Компилятор помечает строчку 6 кода сообщением, "Static methods can't be overridden." (Статические методы не могут быть отменены). Если бы шестая строка была заменена на " static void test() {}" , то компиляция прошла бы успешно.

Некоторые важные пункты относительно статических методов:
Статические методы класса вызываются только статическими методами.
Статический метод не имеет 'this'
Статический метод не может быть отменён нестатическим методом

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

Блок инициализации - блок кода между фигурными скобками, который выполнен прежде, чем будет создан объект класса. Статический блок инициализации - определенный блок, использующий ключевое слово, static, он выполняется один раз, когда загружается класс и может только инициализировать статических членов данного класса.

Давайте определим простой класс со статическим блоком инициализации:

Пример 2:
class Trylnitialization
{
static int[] values = new int[10]; //Static array member
// Initialization block
static
       {
System.out.println( Running initialization block. );
for(int i=0; ivalues[i] = (int)(100.0*Math.random());
       }
// List values in the array for an object
void listValues()
       {
System.out.println();        // Start a new line
for(int i=0; iSystem.out.print(        + values[i]); //Display values
System.out.println () ;                 // Start a new line
       }
public static void main(String[ ] args)
       {
Trylnitialization example = new Trylnitialization(); System.out.println( nFirst object: );
example.listValues();
example = new Trylnitialization();
System.out.println( nSecond object: );
example.listValues();
       }
}

Когда мы компилируем и выполняем эту программу, мы используем идентичные наборы значений для двух объектов - как могли бы ожидаться, так как массив значений является статическим.

Вывод вышеупомянутой программы:

Рисунок 4.2: Вывод


В вышеупомянутом примере класс Trylnitialization имеет статический член, значения которого является массив 10 целых чисел. Эти значения могут отличаться из-за использования функции Math.random (), которая производит случайные числа. Статический блок инициализации - код:
static
{
System.out.println( Running initialization block. );
for(int i=0; ivalues [i] = (int) (100.0*Math.random());
}

Здесь инициализируется массив значений с псевдослучайными значениями целого числа, произведенными в for loop. Запись вывода в блоке должна делать запись только там, где выполняется блок инициализации. Поскольку этот блок инициализации является статическим, то он выполняется только однажды в течение выполнения программы, когда загружен класс.

Метод print (), мы используем в listValues () для работы метода точно так же как println (), но не запуская новую запись кода перед представлением вывода, так что мы получаем все значения на той же самой записи.

В main(), мы создаём объект типа Trylnitialization, и затем вызываем его методом listValues (). Мы тогда создаем второй объект и вызываем методом listValues () для того же. Вывод демонстрирует, что инициализация блока выполняет только однажды, и что значения переданные для обоих объектов, одни и те же.

назад к оглавлению вперед

Rus. Open Source company, г. Саратов
ул. Орджоникидзе, 156, офис 203
тел: 8 (8452) 57-84-41
e-mail: info@rus_opensource.com

Главная | Обзоры | О разном
Карта сайта

Учебная литература:

Введение в Linux
Основы JAVA
Архивы

© 2013 opensourcerules.net