• Объявить член класса открытым (public), то есть доступным для кого угодно и откуда угодно.
• Сделать член доступным в пакете, не указывая другие спецификаторы доступа, и разместить другие классы в этом же пакете.
• Как вы увидите в главе 7, где рассказывается о наследовании, производный класс может получить доступ к защищенным (protected) членам базового класса вместе с открытыми членами public (но не к приватцым членам private). Такой класс может пользоваться доступом в пределах пакета только в том случае, если второй класс принадлежит тому же пакету (впрочем, пока на наследование и доступ protected можно не обращать внимания).
• Предоставить «методы доступа», то есть методы для чтения и модификации значения. С точки зрения ООП этот подход является предпочтительным, и именно он используется в технологии JavaBeans.
public
При использовании ключевого слова public вы фактически объявляете, что следующее за ним объявление члена класса доступно для всех, и прежде всего для клиентских программистов, использующих библиотеку. Предположим, вы определили пакет dessert, содержащий следующий компилируемый модуль:
// access/dessert/Cookie.java 11 Создание библиотеки, package access.dessert.
public class Cookie { public CookieO {
System.out.println("Конструктор Cookie");
}
void biteO { System out printlnCbite"); } } /// ~
Помните, что файл Cookie.java должен располагаться в подкаталоге dessert каталога с именем access (соответствующем данной главе книги), а последний должен быть включен в переменную CLASSPATH. Не стоит полагать, будто Java всегда начинает поиск с текущего каталога. Если вы не укажете символ . (точка) в переменной окружения CLASSPATH в качестве одного из путей поиска, то Java и не заглянет в текущий каталог.
Если теперь написать программу, использующую класс Cookie:
// access/Dinner java // Использование библиотеки import access.dessert *;
public class Dinner {
public static void main(Stnng[] args) { Cookie x = new CookieO: //! x.biteO; // Обращение невозможно
}
} /* Output: Конструктор Cookie */// ~
то можно создать объект Cookie, поскольку конструктор этого класса объявлен открытым (public) и сам класс также объявлен как public. (Понятие открытого класса мы позднее рассмотрим чуть подробнее.) Тем не менее метод bite() этого класса недоступен в файле Dinner.java, поскольку доступ к нему предоставляется только в пакете dessert. Так компилятор предотвращает неправильное использование методов.
Пакет по умолчанию
С другой стороны, следующий код работает, хотя на первый взгляд он вроде бы нарушает правила:
//• access/Cake java
// Обращение к классу из другого компилируемого модуля
class Cake {
public static void mainCString[] args) { Pie x = new PieO, x f():
}
} /* Output. Pie f() */// ~
Второй файл в том же каталоге:
//• access/Pie.java
// Другой класс
class Pie { void f() { System.out.pnntlnC'Pie.fO"): }
} ///:-
Вроде бы эти два файла не имеют ничего общего, и все же в классе Cake можно создать объект Pie и вызвать его метод f()! (Чтобы файлы компилировались, переменная CLASSPATH должна содержать символ точки.) Естественно было бы предположить, что класс Pie и метод f() имеют доступ в пределах пакета и поэтому закрыты для Cake. Они