Java基础-21-基本语法-封装
封装(Encapsulation)
1. 什么是封装?
封装(Encapsulation)是面向对象编程(OOP)中的一个重要特性。它指的是将对象的属性和行为封装在一个类中,并提供访问控制机制,防止外部直接访问对象的内部数据,而是通过**公共方法(getter 和 setter)**来访问和修改数据。
封装的核心思想:
-
隐藏对象的实现细节,只暴露必要的接口。
-
控制数据的访问权限,防止外部程序对对象的数据进行非法操作。
-
提高代码的可维护性和安全性。
2. 封装的实现方式
封装通常通过以下方式来实现:
-
使用
private
关键字修饰成员变量,限制外部直接访问。 -
提供
public
关键字的 getter 和 setter 方法,让外部可以通过这些方法访问和修改变量。 -
在 setter 方法中添加逻辑,确保数据的安全性。
-
可以使用
protected
或default
(不写修饰符)来设置不同级别的访问权限。
3. 访问修饰符
访问修饰符 | 当前类 | 同包子类 | 同包非子类 | 其他包子类 | 其他包非子类 |
---|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ | ❌ |
default | ✅ | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ | ✅ |
-
private
:只能在当前类中访问。 -
default
(默认权限):同包内可访问。 -
protected
:同包和其他包的子类可访问。 -
public
:任何地方都可以访问。
4. 封装的示例
下面是一个使用封装的示例,展示如何通过 getter 和 setter 方法来访问 private
变量。
// 定义一个 Person 类,使用封装
public class Person {
// 私有成员变量
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.setAge(age); // 使用 setter 进行赋值
}
// getter 方法 - 获取 name
public String getName() {
return name;
}
// setter 方法 - 设置 name
public void setName(String name) {
this.name = name;
}
// getter 方法 - 获取 age
public int getAge() {
return age;
}
// setter 方法 - 设置 age,添加校验逻辑
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("年龄不合法!");
}
}
}
// 测试封装
public class TestEncapsulation {
public static void main(String[] args) {
// 创建对象
Person p = new Person("张三", 25);
// 获取属性值
System.out.println("姓名: " + p.getName());
System.out.println("年龄: " + p.getAge());
// 修改属性值
p.setAge(200); // 不合法
p.setAge(30); // 合法
System.out.println("修改后年龄: " + p.getAge());
}
}
运行结果:
姓名: 张三
年龄: 25
年龄不合法!
修改后年龄: 30
在上面的示例中:
-
name
和age
是private
的,外部无法直接访问。 -
通过
getName()
和getAge()
方法获取值。 -
通过
setAge()
方法修改值,并在方法中添加校验逻辑,确保数据合法。
5. 封装的优点
-
数据安全性:防止数据被随意修改,提高安全性。
-
提高代码复用性:通过 setter 方法可以加入数据校验逻辑,避免重复代码。
-
降低耦合性:外部不需要知道类的内部实现,只需调用公开的方法。
-
便于维护和修改:可以在不影响外部调用的情况下修改类的内部实现。
6. 适用场景
-
数据保护:防止数据被外部随意修改(如银行账户余额)。
-
约束输入:在 setter 方法中添加数据校验逻辑。
-
隐藏复杂性:让外部只关注如何使用,而不需要关心实现细节。
-
框架开发:如 Spring 框架中的 Java Bean 规范,要求使用 private 变量+getter/setter。
7. 总结
封装是 Java 面向对象编程的三大特性之一,主要通过私有化成员变量,并提供公共的 getter 和 setter 方法来访问它们,从而提高数据安全性和程序的健壮性。
掌握封装的概念并在实际开发中应用,有助于写出更安全、可维护、低耦合的代码。