6.2.4 Статические поля и методы

Когда мы создаем объект класса, то поля, описанные в классе, фактически превращаются в переменные объекта. Методы, описанные в классе, становятся методами объекта и имеют доступ к полям только «своего» объекта. Такие члены класса называют нестатическими.

Но могут существовать и статические члены класса. Они являются «общими» для всех объектов класса и существуют, даже если не создан ни один объект. К статическому члену класса можно обращаться через объект, указав через точку после имени объекта имя статического члена. Но предпочтительным является прямое обращение через имя класса. При этом после имени класса через точку указывают имя вызываемого статического члена класса.

При описании статического члена используется ключевое слово static. Статическое поле при необходимости можно инициализировать присвоением значения непосредственно в теле класса.

В определенном смысле, статические поля можно рассматривать, как глобальные переменные, доступные из любого места программы, а статические методы – как глобальные функции.

В листинге 6.6 приведен пример описания класса со статическими членами и обращения к ним.


Листинг 6.6 Пример класса со статическими членами

class MyClass {

// статическое числовое поле

static int number=5;

// статическое текстовое поле

static String text=«Hello»;

// статическй метод (вывод текста на печать)

static void showText () {

System.out.println (text);

}

// статический метод (вывод числа на печать)

static void showNumber () {

System.out.println (number);

}

}

public class Listing6_6 {


public static void main (String [] args) {

// прямое обращение к статическим методам

// без создания объекта класса

MyClass.showText ();

MyClass.showNumber ();


// прямое обращение к статическим полям

// без создания объекта класса

MyClass.number=15;

MyClass. text=«Java»;


// проверяем, изменились ли статические поля

// после прямого обращения

MyClass.showText ();

MyClass.showNumber ();


// создаем объект класса

MyClass obj=new MyClass ();

// обращаемся к статическим полям

// в качестве полей объекта

obj.showText ();

obj.showNumber ();

}

}

В данном примере мы включили в описание класса два статических поля, целочисленное и текстовое, а также два статических метода, которые выводят содержимое полей на печать.

В главном классе мы обращаемся напрямую к статическим методам класса. Для этого указываем имя класса и через точку – имя статического метода, принадлежащего классу. Затем аналогичным способом обращаемся напрямую к статическим полям и присваиваем им новые значения. Чтобы убедиться, что значения полей изменились, вновь обращаемся к статическим методам вывода на печать.

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


6.2.5 Закрытые члены класса

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