3.3 Создание самостоятельного класса (часть 2)

3.3.3 Передача по значению


Передача по значению означает, что, когда мы вызываем метод, мы передаём копию значения каждого фактического параметра методу. Мы можем изменить эту копию в методе, но это ни как не отразится на фактическом параметре.

В отличие от многих других языков, Java не имеет никакого механизма для изменения значения фактического параметра.
Например:

int х = 5;
doStuff(х); // pass a COPY of x (the value 5) to the doStuff method
The doStuff method looks like this:
void doStuff(int y)   {
       // use у in some way
}


Копию значения в х, которое равно 5, передают в метод doStuff (). В свою очередь метод doStuff () имеет свою собственную новую переменную, названную у.

Переменная 'у' новая, различающаяся с копией переменной, которая была в х во время передачи её методу. С этого момента, у и х не затрагивают друг друга. Если мы изменяем у, это не будет затрагивать х.
void doStuff(int у)   {
     у = 27; // this does NOT affect x
}


и напротив. Если мы изменяем х, это не изменяет у. Происходит копирование 'х' и передача В метод doStuff (). Давайте рассмотрим пример для передачи по значению
Пример 3:
      public class PassTest
     {
int b;
String s;
     PassTest(int n, String m)
           {
     b = n;
     s = m;
}
public void passingValue(int a)
           {
     a=50;
     System.out.println( In passingValue:a= +a);
}
public static void main(String args[])
           {
     int a = 10;
     PassTest pass = new PassTest (a, msg );
           System.out.println( Passing by Value );
     System.out.println( Before: a = + a);
           pass.passingValue(a);
           System.out.println( After: a= + a);
           }
}



Вывод показан ниже:
Рисунок 3.5: Вывод

В примере, мы можем видеть, что начальное значение а - 10. В Строке 14 создаётся объект PassTest со значениями а и msg, которые будут передаваться функции конструктора (Строка 4). В Строке 16, мы печатаем значение а, которое равно 10. В методе passingValue (a), значение 10 будет передаваться методу, то есть методу передаётся копия. При определении метода, мы изменяем значение а на 50, но это не будет затрагивать переменную внутри main ().

3.3.4 Ссылка'this'

Классы могут очень быстро стать большими. Каждый класс может иметь много полей данных и методов. Если мы создадим много объектов класса, то вопрос о требуемых объемах и конфигурации памяти может стать существенным. Необязательно сохранять отдельную копию каждой переменной и метода для каждой реализации класса. Компилятор правильно обращается к полям данных объекта, потому что мы неявно передаем ссылку this методам класса.

Статические методы, или методы класса, не имеют ссылки 'this', потому что они не имеют никакого объекта, связанного с ней.

Ключевое слово this связано с объектом. Оно используется, чтобы указать текущий объект.
Пример 4:

public class PassTest
{
int x;
PassTest(int x)
   {
this.x=x;
   }
public void passingValue()
   {
System.out.println( In passingValue:a=   +x);
   }
public static void main(String args[])
   {
PassTest test = new PassTest (10);
test.passingValue();
   }
}


Рисунок 3.6: Вывод

this.x = x ;

указывает, что переменной х этого объекта должно быть назначено значение переменной х.

3.3.5 Сокрытие данных

Один из важных объектно-ориентированных принципов, которые мы пока не обсудили, заключается в сокрытии данных в пределах класса и делает их доступными только через методы. Эта методика известна как инкапсуляция, с помощью которой можно безопасно запечатывать данные (и внутренние методы) внутри класса, где к ним могут обратиться только методы с доверительными отношениями (то есть, методы класса).

Почему мы хотели бы реализовать такой механизм сокрытия данных? Самая важная причина состоит в том, чтобы скрыть внутренние особенности выполнения нашего класса. Мы предостерегаем программистов от ошибок при дальнейшей детализации кода. Таким образом, мы можем более безопасно изменять код, не нарушая его целостности.

Другая причина применения инкапсуляции состоит в том, чтобы защитить наш класс от случайного или преднамеренного повреждения. Класс часто содержит множество взаимозависимых полей, которые должны быть в непротиворечивом состоянии. Если мы позволяем программистам непосредственно управлять этими полями, то они могут изменить одно поле, не изменяя важные связанные поля, таким образом, оставляя класс в противоречивом состоянии. Использование метода исключает такие состояния. Также, если класс определяет некоторые методы для внутреннего использования, то только сокрытие этих методов предотвращает пользователей класса от запроса к ним.

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

Есть также другие причины сокрытия полей и методов класса:
      Внутренние поля и методы, которые являются видимыми вне класса, только загромождают API. В результате минимального выставления полей наружу наш класс становится более легким для использования и понимания.
      Если поле или метод является видимым пользователям нашего класса, то мы можем задокументировать этот момент. Также мы можем сэкономить наше время и усилия, не занимаясь документацией.

3.3.6 Управление доступом с помощью Private и Public -спецификаторы доступа


Все поля и методы класса могут всегда непосредственно использоваться в пределах тела класса. Java определяет правила управления доступом, которые ограничивают членов класса от того, чтобы быть используемым вне класса. Ключевое слово public, наряду с protected и private, называется модификатором управления доступа. Модификаторы управления доступом определяют правила доступа к полям или методам.

Объявление со спецификатором доступа public составляет интерфейс объектов класса. К компонентам данных и членам функций, объявленными со спецификатором доступа public можно обратиться с помощью любой внешней функции (т.е. находящейся вне класса).
Рисунок 3.7: Private и Public

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

назад к оглавлению вперед

Rus. Open Source company, г. Саратов
ул. Орджоникидзе, 156, офис 203
тел: 8 (8452) 57-84-41
e-mail: info@rus_opensource.com

Главная | Обзоры | О разном
Карта сайта

Учебная литература:

Введение в Linux
Основы JAVA
Архивы

© 2013 opensourcerules.net