Доступ к членам класса
В рассматривавшихся ранее примерах доступ к полям и методам вне класса, в котором они определены, осуществлялся без особых проблем. На самом деле далеко не всегда к членам класса можно получить доступ вне пределов класса, то есть из кода, не входящего в тело класса.
В Java в зависимости от доступности все члены класса можно разделить на три группы: открытые, закрытые и защищенные. Во всех рассматривавшихся ранее примерах все члены классов были открытыми и, в силу этого обстоятельства, доступными за пределами класса. Таким образом, открытые члены класса — это члены класса, которые доступны вне этого класса. Если в каком-то месте программы создается объект класса, то к полям и методам этого объекта можно обращаться способом, описанным ранее (например, в формате объект.метод или объект.поле).
Если поле или метод является закрытым, ничего из упомянутого сделать не удастся. К закрытым членам класса доступ осуществляется только в пределах класса. К закрытому полю можно обращаться в методах класса, но нельзя обратиться к полю вне класса. Закрытые методы класса могут вызываться только методами класса, но не могут вызываться извне класса.
Разница между закрытыми и защищенными членами класса проявляется только при наследовании. Если о наследовании речь не идет, то можно полагать, что защищенный член класса — это аналог закрытого члена.
Нельзя сказать, что все сказанное полностью описывает ситуацию с закрытыми и открытыми членами класса. К этому вопросу мы еще вернемся при изучении наследования, после того как познакомимся с пакетами. Пока же ограничимся таким несколько упрощенным взглядом на предмет.
Для определения уровня доступности используются три идентификатора: public, private и protected — идентификаторы доступа соответственно для открытых, закрытых и защищенных членов. Идентификатор доступа указывается для каждого члена класса отдельно. Здесь проявляется отличие языка Java от языка С++: в С++ идентификаторы доступа указываются для групп членов.
Если идентификатор доступа не указан вовсе, соответствующий член считается открытым. Именно этой особенностью мы пользовались ранее, когда не указывали для членов класса идентификаторы доступа. Обращаем внимание читателей, знакомых с С++: там по умолчанию члены класса считаются закрытыми.
В листинге 4.4 приведен пример использования открытых и закрытых членов класса.
Листинг 4.4. Закрытые и открытые члены класса
class MyClass{
// Закрытые поля:
private int a;
private int b;
// Закрытый метод:
private void showab(){
// Обращение к закрытым полям в классе:
System.out.println("a="+a);
System.out.println("b="+b);}
// Открытый метод:
public void setab(int x,int y){
// Обращение к закрытым полям в классе:
a=x;
b=y;
System.out.println("Присвоены значения полям!");}
// Открытый метод:
void getab(){
System.out.println("Проверка значений полей:");
// Обращение к закрытому методу в классе:
showab();}
}
class PrivateDemo{
public static void main(String[] args){
// Создание объекта:
MyClass obj=new MyClass();
// Вызов открытых методов:
obj.setab(3,5);
obj.getab();
}}
В классе MyClass объявлены два закрытых целочисленных поля a и b. Поскольку поля закрытые, присвоить им значения вне класса простым обращением к полям невозможно. Для инициализации полей в классе объявляется метод setab() . У метода два целочисленных аргумента, значения которых присваиваются полям a и b. Обращаем внимание, что метод setab() имеет доступ ко всем членам класса, в том числе и к закрытым полям, поскольку метод описан в том же классе, что и поля. Метод setab() описан с использованием идентификатора уровня доступа public. Хотя в методе getab() идентификатор доступа не указан, метод также является открытым (по умолчанию). В этом открытом методе выполняется обращение к закрытому методу showab(), который обеспечивает вывод значений закрытых полей a и b.
В главном методе программы класса PrivateDemo сначала создается объект obj класса MyClass. Командой obj.setab(3,5) закрытым полям объекта obj присваиваются значения 3 и 5 соответственно. Командой obj.getab() значения полей выводятся на консоль. В результате выполнения программы получаем:
Присвоены значения полям!
Проверка значений полей:
a=3
b=5
Еще раз хочется отметить, что в методе main() нельзя, например, воспользоваться инструкцией вида obj.a, obj.b или obj.showab() , поскольку соответствующие члены класса MyClass являются закрытыми (private). В программе использован следующий подход: доступ к закрытым членам осуществляется через открытые методы. На первый взгляд такой способ реализации класса может показаться нелогичным и неудобным, но это не так. Представим ситуацию, когда необходимо ограничить и четко регламентировать операции, допустимые с полями класса. Самый надежный способ для этого — сделать поля закрытыми, а для допустимых операций над полями предусмотреть открытые методы. Аналогия такая, как если бы мы имели дело с черным ящиком (класс). Внутреннее содержимое ящика — закрытые члены класса. Открытые методы — рычажки, которые позволяют запускать внутренние механизмы. Что не предусмотрено конструкцией, выполнено быть не может. Это позволит сделать код безопасным, а работу с объектами класса удобной. Данная методика широко используется на практике. Кроме того, нередко закрытыми членами класса делают вспомогательные методы, которые применяются только в пределах программного кода класса на промежуточных этапах вычислений.
Дата добавления: 2016-06-13; просмотров: 1162;