Учим Java. Модификаторы

Учим Java. Модификаторы В этой статье мы как можно подробнее рассмотрим модификаторы, используемые при объявлении классов, полей и методов. Также вкратце коснемся модификаторов для разграничения доступа элементов класса.

Модификаторы — это, по сути, служебные слова, которые придают классу, полю класса или методу определенные свойства. С некоторыми из них вы уже успели познакомиться, например public.
Начнем, пожалуй, с модификаторов, используемых при объявлении классов. Первый — это public. Этим модификатором мы указываем, что мы можем объявлять ссылки на этот класс в любом коде. Если же модификатор public не задан, то использовать класс мы можем исключительно внутри пакета. Помимо того, что мы можем создавать экземпляры класса, помеченного как public, нам также дозволено обращаться к полям и методам этого класса, помеченным этим же модификатором.
В контексте отдельного пакета подразумевается, что класс с модификатором public должен соответствовать имени этого файла. Но это должно быть вам уже известно из предыдущих статей.
Пример объявления класса:
public class MyPublicClass
{
// ...
}

Следующий модификатор, предназначенный для рассмотрения, — это abstract. Он позволяет объявить класс неполноценным и не предназначенным для создания его экземпляров. Классы с таким модификатором можно только наследовать. Это обуславливается наличием у класса абстрактных методов. О них речь пойдет позже.
abstract class MyAbstractClass
{
// ...
}

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

final class MyFinalClass
{
// ...
}

Помимо вышеперечисленных модификаторов для объявления классов, существует также strictfp. Его цель — определить точное и единообразное выполнение операции над числами с плавающей запятой на всех JVM (виртуальная машина Java).
При объявлении класса вы можете использовать сразу несколько модификаторов. Из их определений можно заметить, что единовременно нельзя использовать модификаторы final и abstract по причине их противоположности.
Пример объявления класса с несколькими модификаторами:
public final MyCommonClass
{
// ...
}

Это что касается классов. Немного по-другому дело обстоит с полями классов. Здесь, помимо обычных модификаторов, присущих полям, имеют место быть также модификаторы доступа. Модификаторы доступа — это зарезервированные слова, которые определяют область видимости/доступа полей или же методов класса. Заметьте, что классу не свойственно определение модификаторов доступа, понятно почему.
Итак, перечислим модификаторы доступа:
— private — метод или поле класса, помеченные этим модификатором, доступны только в пределах данного класса;
— package — поле/метод доступно в пределах всего пакета; это значение по умолчанию для всех полей или методов, объявленных без модификаторов доступа;
— protected — здесь доступ разграничивается для всех "родных" (т.е. производных или родительских) классов данного класса;
— public — доступ открыт отовсюду и для всех;
После этого можно перейти к списку модификаторов у полей.
И первое из них — это static. Использованию статических полей и методов можно посвятить отдельную статью. Статические поля — это поля, которые едины для всех объектов данного класса. Т.е. ссылка этого поля у любого экземпляра класса будет ссылаться на одно и то же значение. Например:

class box
{
public static int iNum;
}

public MyBox
{
public static void main(String argv[])
{
box a = new box();
box b = new box();
a.iNum = 123;
System.out.println("box b.iNum = "+b.iNum);
}
}

Результатом выполнения данной программы будет:
box b.iNum = 123

final — это модификатор, позволяющий объявлять константные поля в классе. Если у вас есть некоторое свойство проектируемого вами объекта, значение которого не будет меняться, то вы может воспользоваться этим модификатором. Любая попытка переопределить значение поля с модификатором final приводит к выбросу исключения.
public final String boxCompanyName = "BlackBox :)";

Далее я просто перечислю два специфических и очень важных модификатора:
— transient — решает проблему сериализации (представления объекта в виде последовательности байтов данных);
— volatile — необходим в процессе синхронизации потоков вычислений и управления памятью;
И последнее, что нам осталось рассмотреть, — это использование модификаторов при объявлении методов.
Когда вы объявляете метод класса, то вправе также использовать и модификаторы доступа. Это, как и в случае с полями, позволяет ограничить доступ к вызову методов класса.
Опять же модификатор static позволяет определять статические методы. Это такие методы, которые являются общими для класса, а не для отдельного объекта этого класса. Также они могут работать лишь со статическими полями класса, и понятно почему. Ведь если бы они могли обращаться к нестатическим (назовем их так) полям, то объявление метода статическим теряло бы всякий смысл.
class box
{
private static int iNum;
public static void ChangeiNum(int x)
{
iNum = x;
}
}

public class MyBox
{
public static void main(String argv[])
{
box a = new box();
a.ChangeiNum(5); // здесь мы изменили private значение поля iNum объекта a, класса box
}
}

Об абстрактных методах мы уже говорили. Они специально предназначены для перегрузки в классе-потомке:
abstract void MyAbstractMethod (String MyString);

Метод, помеченный как synchronized, опять же, относится к проблеме управления вычислительными потоками, одновременно выполняющимися в контексте программного приложения.
Существует также замечательный модификатор native, позволяющий реализовывать любые системные операции на низком уровне. Это напрочь лишает Java-код переносимости между платформами, но зато позволяет использовать любые системные API вызовы операционной системы. Языком для написания native-методов, как правило, является C++. Библиотеки API предлагаются разработчиками виртуальных Java-машин для тех или иных платформ и языков. Например, JNI (Java Native Interface) — стандартная библиотека для C.
public native getMemoryCount();

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

Алексей Литвинюк


Компьютерная газета. Статья была опубликована в номере 18 за 2002 год в рубрике программирование :: java

©1997-2024 Компьютерная газета