一、概念
在 Java 中,封装是一种面向对象编程(OOP)的关键特性。它涉及到将数据(属性)和操作这些数据的方法捆绑在一起,并隐藏对象的内部状态和实现细节,只允许通过有限的接口来访问和修改这些状态。
二、封装优点
- 数据隐藏:封装使得类的内部状态对外部不可见,只能通过类中定义的公共方法访问。
- 增强安全性:通过限制对类内部数据的直接访问,可以防止外部代码意外或恶意地改变数据状态。
- 更好的控制:通过 getter 和 setter 方法,可以对数据的读和写操作施加额外的逻辑控制。
- 减少代码冗余:由于封装促进了代码重用,相同的逻辑可以在多个类中使用,而无需重复编写代码。
三、实现步骤
第一步:修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Student {
private String name;
private int age;
}
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就实现了数据隐藏。
第二步:给每个值提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
采用 this 关键字是为了解决 成员变量
和 局部变量
之间发生的同名的冲突
。
由于属性私有化了,所以外部类想使用当前 Student类 属性,只能通过 getXxx()/setXxx() 来访问,这样就实现增强安全性、更好的控制和减少代码冗余。
三、测试样例
// 文件名:Student.java
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 文件名:Test.java
public class Test{
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);
System.out.println("姓名:" + stu.getName() + "\n年龄:" + stu.getAge());
}
}
运行结果:
姓名:张三
年龄:18