Перевод на русский © , 2000
Java Q&A
Можно ли объявить внутренний или обычный класс как статический (static)?
Для того, чтобы понять использование ключевого слова static в заголовке класса мы должны разобраться с заголовками классов вообще. Вы можете объявить два типа классов: обычные классы (верхнего уровня) и внутренние.
Обычные классы Вы объявляете обычный класс на уровне члена пакета (package). Каждый обычный класс соответствует своему собственному файлу java, использующему тоже имя, что и класс.
Обычный класс по-определению уже находится снаружи, поэтому нет смысла объявлять его статическим; это ошибка. Компилятор определит ее и сообщит вам.
Внутренние классы Вы определяете внутренний класс внутри обычного класса. В зависимости от того, как он определен, внутренний класс может быть одного из четырех типов:
1. Анонимный. Анонимный класс объявляется и создается внутри одного и того же выражения. У них нет имен и они могут быть созданы только один раз.
Вот пример анонимного класса:
okButton.addActionListener( new ActionListener(){ public void actionPerformed (ActionEvent e){ dispose(); } });
Так как анонимный класс не содержит нормального заголовка класса, где можно использовать static, он не может быть объявлен, как статический.
2. Локальный. Локальные классы точно такие-же, как и локальные переменные, в том смысле, что они создаются и используются внутри блока кода. Как только класс внутри блока объявлен, он может быть создан сколько угодно раз внутри этого блока. Как и локальные переменные, локальные классы не могут быть объявлены как public, protected, private или static.
Вот пример кода:
//some code block .......{ class ListListener implements ItemListener { List list; public ListListener(List l) { list = l; }
public void itemStateChanged(ItemEvent e) { String s = l.getItemSelected(); doSomething(s); } } List list1 = new List(); list list2 = new List(); list1.addItemListener( new ListListener(list1)); list2.addItemListener( new ListListener(list2)); }