Обзор пакета:
Инкапсуляция относится к сокрытию свойств и деталей реализации объекта и предоставлению публичного доступа только к внешнему миру.
Что это значит?
Проще говоря, я «запираю» данные, которые не хочу показывать другим, а также внутренние детали, о которых другим знать не нужно, оставляя лишь некоторые входы, чтобы связать их с внешним миром.
Как мы «запираем» наши данные?
Мы используем модификаторы разрешений, такие как public, private, protected, чтобы установить границы внутри класса, и эти различные степени «блокировки» определяют, кто может использовать то, что определено сразу после него.
Преимущества инкапсуляции:
·Скрыть детали реализации и предоставить публичный доступ
·Улучшить возможность повторного использования кода
·Улучшить безопасность
Способы воплощения преимуществ инкапсуляции:
(1) Скрыть детали реализации и предоставить публичный доступ
Как разобраться в скрытых деталях реализации?
Мы инкапсулируем некоторые функции в класс, и программисту-клиенту не нужно знать принцип логики этого метода в классе, программисту класса нужно только дать ему внешний интерфейс, а программисту-клиенту нужно только уметь вызывать этот метод.
Например: летом в общежитии очень жарко, нам (пользователям) нужно только управлять пультом дистанционного управления, чтобы использовать кондиционер, и нам не нужно знать, как работает кондиционер внутри.
Как насчет предоставления общего доступа?
Сначала рассмотрим стандартный случай
public class Student {
//定义成私有成员变量(private)
private String name;
private int age;
//无参构造
public Student() {
super();
}
//带参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//成员变量的set和get方法(与外界联系的桥梁)
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
//创建学生类对象 s
Student s = new Student();
//对象s调用类中的公共方法setName()和setAge()
//set方法给成员变量赋值
s.setName("BWH_Steven");
s.setAge(20);
//get方法获取成员变量
System.out.println(s.getName() + s.getAge());
}
}
Мы видим, что в приведенном выше случае все переменные-члены изменяются с помощью private, а следующие методы get и set изменяются с помощью public, Фактически, свойства, измененные с помощью private, - это то, что нам нужно.взапертиданные, а методы set и get являются ключами для открытия замка
Контент, измененный приватным, за исключениемЭлементы, к которым не может получить доступ никто, кроме создателя типа и внутренних методов типа., поэтому наши данные «заблокированы» нами через private, и наш внешний мир может вызывать общедоступные методы в классе, создавая объекты, поэтому методы set и get, модифицированные public, могут быть доступны внешнему миру, в то время как эти два метода могут прямой доступ к нашим закрытым переменным-членам, поэтому методы set и get стали ключами для закрытых членов для связи с внешним миром.
(2) Улучшить возможность повторного использования кода
Функция инкапсулирована в класс, а возможность повторного использования кода улучшена за счет некоторых механизмов (комбинации и наследования) между базовым классом и производным классом.
Ps: По поводу повторного использования кода я объясню в специальной статье, а сегодня сосредоточусь на основных преимуществах инкапсуляции.
(3) Повышение безопасности
После прочтения приведенного выше кода у вас могут возникнуть некоторые сомнения: я все еще вижу эти атрибуты и методы после их инкапсуляции, где это отражает безопасность? Давайте взглянем на нашу улучшенную версию случая ниже
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//在setAge()方法中加入了校验的内容
//不合法数据是不允许传递给成员变量的
public void setAge(int age) {
if (age < 0 || age > 120) {
System.out.println("Error");
}else {
this.age = age;
}
}
public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.getName() + s.getAge());
//错误的方式!!!
s.name = "BWH_Steven";
s.age = 20;
System.out.println(s.getName() + s.getAge());
//正确的方式!!!
s.setName("BWH_Steven");
s.setAge(20);
}
}
Не без основания мы используем private для изменения наших переменных-членов.Если модификатор нашей переменной-члена изменен на общедоступный, это предложение означает, что внешний мир может использовать объект для прямого доступа и изменения этой переменной-члена, что может вызвать некоторые Основные проблемы.
Например, когда внешний мир присваивает значения переменным-членам через объекты, могут быть присвоены некоторые недопустимые данные.
Это явно неразумно. Таким образом, данные должны быть оценены, прежде чем назначать
StudentDemo — тестовый класс,Тестовые классы обычно только создают объекты и вызывают методы.
Таким образом, это суждение должно быть определено в классе Student. нужно использовать логические утверждения
Логические операторы должны быть определены в методах. Поэтому предоставьте метод в классе Student для проверки данных
Но если мы не вызываем метод для присвоения значения, мы все равно присваиваем значение напрямую, поэтому наш метод не работает.
такМы должны принудительно использовать мой метод вместо прямого вызова переменных-членов.
Вот почему мы используем private для изменения переменных-членов!
конец:
Если есть какие-либо недостатки или ошибки в содержании, вы можете оставить сообщение для меня, чтобы сделать комментарии, все! ^_^
Если это может вам помочь, то следуйте за мной!
Мы не знаем друг друга здесь, но мы все усердно работаем над своей мечтой ❤
Публичный аккаунт, настаивающий на продвижении оригинальной технологии Java: в идеале — более двух дней.