// тело метода

}

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

Листинг 2. Класс со статическими элементами

class UsingStatic{

// Статические поля:

static int а=3;

static int b;

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

static void meth(int х){

System. out. println("x="+x);

System. out. println("a="+a);

System. out. println("b="+b);}

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

static{

System. out. println( "Статический' блок: ");

b=а*4; }

// Вызов статического метода:

public static void main(String args[]){

meth(123);

}}

В классе UsingStatic описано два статических поля а и b типа int и статический метод meth(). Для статического поля а указано значение 3. Статическое поле b значением не инициализировано. Инициализация этого поля выполняется в статическом блоке командой b=а*4, причем предварительно выводится сообщение Статический блок.

Статический метод meth() результат не возвращает. Ему передается целочисленный аргумент. Действие метода состоит в последовательном выводе сообщения со значениями аргумента метода и статических полей класса.

В этом же классе UsingStatiс описан метод main(), в котором всего одна команда вызова метода meth() с аргументом 123. Обращаем внимание, что поскольку статический метод вызывается из того же класса, в котором он описан, для вызова метода достаточно указать его имя. В результате выполнения про граммы мы получим следующее:

НЕ нашли? Не то? Что вы ищете?

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

x=123

а=3

b=12

Выполнение статического блока происходит при загрузке программного кода класса, поэтому еще до вызова метода meth() в главном методе программы статическая переменная b получает значение благодаря предварительному выполнению команд статического блока. Еще один пример использования статических элементов приведен в листинге 3.

Листинг 3. Использование статических элементов

class MyStatic{

// Статические поля:

static int а=50;

static int b=120;

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

static void callme(){

System. out.рrintln(" а="+а);

}}

// Использование статических элементов:

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);

}}

Результатом выполнения программы является следующая серия сообщений:

а=50

а=-25

b=120

В данном случае описано два класса. В классе MyStatic описаны два статических целочисленных поля а и b с предопределенными значениями 50 и 120 соответственно. Кроме того, в классе описан статический метод саllmе(). Метод не имеет аргументов и не возвращает результат, а его действие состоит в выводе значения статического поля а. В главном методе программы в классе StaticDemo создается два объекта obj1 и obj2 класса MyStatic. Однако предварительно с помощью команды MyStatiс. саllmе() вызывается метод саllmе(). Другими словами, статический метод вызывается еще до того, как созданы объекты класса - в них для вызова статического метода или обращения к статическому полю нет необходимости. Далее командой obj1.а=-25 полю а присваивается новое значение. Формально в данном случае речь идет о поле объекта obj1, но поскольку поле статическое, то эффект «глобальный». В этом несложно убедиться, проверив результат выполнения команды System. out. println("a="+obj2.а). Наконец, пример обращения к статическому полю через ссылку на класс представлен командой System. out. println("b="+MyStatic. b).

Хочется особо обратить внимание на несколько важных обстоятельств. Так, в приведенном примере отсутствует статический блок. Обращение к статическим элементам выполняется как через ссылку на класс, так и через ссылки на конкретные экземпляры класса. В последнем случае изменение значения поля для одного объекта означает такое же изменение этого поля для прочих объектов (на самом деле речь идет об одном общем для всех объектов поле). Кроме того, для использования статических элементов вообще нет необходимости создавать экземпляры Класса (объекты).

Доступ к членам класса

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

В Java в зависимости от доступности все члены класса можно разделить на три группы: открытые, закрытые и защищенные. Во всех рассматривавшихся ранее при мерах все члены классов были открытыми и, в силу этого обстоятельства, доступными за пределами класса. Таким образом, открытые члены класса - это члены класса, которые доступны вне этого класса. Если в каком-то месте программы создается объект класса, то к полям и методам этого объекта можно обращаться способом, описанным ранее (например, в формате объект. метод или объект. поле).

Если поле или метод является закрытым, ничего из упомянутого сделать не удастся. К закрытым членам класса доступ осуществляется только в пределах класса. К закрытому полю можно обращаться в методах класса, но нельзя обратиться к полю вне класса. Закрытые методы класса могут вызываться только методами класса, но не могут вызываться извне класса.

Разница между закрытыми и защищенными членами класса проявляется только при наследовании. Если о наследовании речь не идет, то можно полагать, что защищенный член класса - это аналог закрытого члена.

Для определения уровня доступности используются три идентификатора: public, private и protected - идентификаторы доступа соответственно для открытых, закрытых и защищенных членов. Идентификатор доступа указывается для каждого члена класса отдельно.

Если идентификатор доступа не указан вовсе, соответствующий член считается открытым. Именно этой особенностью мы пользовались ранее, когда не указывали для членов класса идентификаторы доступа.

В листинге 4 приведен пример использования открытых и закрытых членов класса.

Листинг 4. Закрытые и открытые члены класса

class MyClass{

// Закрытые поля:

рrivate int а;

private int b;

// Закрытый метод:

private void showab(){

// Обращение к закрытым полям в классе:

System. out. println("a="+a);

System. out. println("b="+b);}

// Открытый метод:

public void setab(int x, int у){

// Обращение к закрытым полям в классе:

а=х;

b=у;

Sуstеm. оut. рrintln("Присвоены значения полям!");}

// Открытый метод:

void getab() {

Sуstеm. оut. рrintln("Проверка значений полей:");

// Обращение к закрытому методу в классе:

Showab();}

}

class PrivateDemo{

public static void main(String[] args){

// Создание объекта:

MyClass obj=new MyClass();

// Вызов открытых методов:

obj. sеtаb(3,5);

obj. getab() ;

} }

В классе MyClass объявлены два закрытых целочисленных поля а и b. Поскольку поля закрытые, присвоить им значения вне класса простым обращением к полям невозможно, Для инициализации полей в классе объявляется метод setab(). У метода два целочисленных аргумента, значения которых присваиваются полям а и b. Обращаем внимание, что метод setab() имеет доступ ко всем членам класса, в том числе и к закрытым полям, поскольку метод описан в том же классе, что и поля. Метод setab() описан с использованием идентификатора уровня доступа publiс. Хотя в методе getab() идентификатор доступа не указан, метод также является открытым (по умолчанию). В этом открытом методе выполняется обращение к. закрытому методу showab(), который обеспечивает вывод значений закрытых полей а и b.

В главном методе программы класса PrivateDemo сначала создается объект obj класса МуClass. Командой obj. sеtаb(3,5) закрытым полям объекта obj присваиваются значения 3 и 5 соответственно. Командой obj. getab() значения полей выводятся на консоль. В результате выполнения программы получаем;

Присвоены значения полям!

Проверка значений полей:

а=3 .

b=5

Еще раз хочется отметить, что в методе main() нельзя, например, воспользоваться инструкцией вида оbj. а, obj. b или obj. showab(), поскольку соответствующие члены класса MyClass являются закрытыми (private). В программе использован следующий подход: доступ к закрытым членам осуществляется через открытые методы. На первый взгляд такой способ реализации класса может показаться нелогичным и неудобным; но это не так. Представим ситуацию, когда необходимо ограничить и четко регламентировать операции, допустимые с полями класса. Самый надежный способ для этого - сделать поля закрытыми, а для допустимых операций над полями предусмотреть открытые методы. Аналогия такая, как если бы мы имели дело с черным ящиком (класс). Внутреннее содержимое ящика - закрытые члены класса. Открытые методы - рычажки, которые позволяют запускать внутренние механизмы. Что не предусмотрено конструкцией, выполнено быть не может. Это позволит сделать код безопасным, а работу с объектами класса удобной. Данная методика широко используется на практике. Кроме того, нередко закрытыми членами класса делают вспомогательные методы, которые применяются только в пределах программного кода класса на промежуточных этапах вычислений.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8