Инкапсуляция Java
Инкапсуляция
Смысл инкапсуляции в том, чтобы убедиться, что «конфиденциальные» данные скрыты от пользователей. Чтобы достичь этого, вы должны:
- объявить переменные/атрибуты класса как
private
- предоставить общедоступные методы получения
и установки для доступа и обновления значения
private
переменной
Получить и установить
Из предыдущей главы вы узнали, что private
доступ к переменным возможен только внутри одного и того же класса (внешний класс не имеет к ним доступа). Однако к ним можно получить доступ, если мы предоставим общедоступные методы get и set .
Метод get
возвращает значение переменной, а set
метод устанавливает значение.
Синтаксис для обоих таков, что они начинаются с или get
или set
, за которым следует имя переменной с первой буквой в верхнем регистре:
Пример
public class Person {
private String name; // private = restricted access
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String newName) {
this.name = newName;
}
}
Объяснение примера
Метод get
возвращает значение переменной name
.
Метод set
принимает параметр ( newName
) и присваивает его
name
переменной. Ключевое this
слово используется для ссылки на текущий объект.
Однако, поскольку name
переменная объявлена как private
, мы
не можем получить к ней доступ вне этого класса:
Пример
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.name = "John"; // error
System.out.println(myObj.name); // error
}
}
Если бы переменная была объявлена как public
, мы ожидали бы следующий вывод:
John
Однако, когда мы пытаемся получить доступ к private
переменной, мы получаем ошибку:
MyClass.java:4: error: name has private access in Person
myObj.name = "John";
^
MyClass.java:5: error: name has private access in Person
System.out.println(myObj.name);
^
2 errors
Вместо этого мы используем методы getName()
и setName()
для доступа и обновления переменной:
Пример
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.setName("John"); // Set the value of the name variable to "John"
System.out.println(myObj.getName());
}
}
// Outputs "John"
Почему инкапсуляция?
- Улучшенный контроль над атрибутами и методами класса
- Атрибуты класса можно сделать доступными только для чтения (если вы используете только
get
метод) или только для записи (если вы используете толькоset
метод) . - Гибкость: программист может изменить одну часть кода, не затрагивая другие части.
- Повышенная безопасность данных