面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。
封装的优点:
良好的封装能够减少耦合。
类内部的结构可以自由修改。
可以对成员变量进行更精确的控制。
隐藏信息,实现细节。
封装主要方式:
使用访问修饰符:
public:表示该成员可以被任何其他类访问。
private:表示该成员只能被其所在类访问,其他类无法直接访问。
protected:表示该成员可以被同一个包内的类以及所有子类访问。
默认(没有修饰符):表示该成员可以被同一个包内的类访问,但不能被包外的类访问(这是包级私有)。
提供getter和setter方法:
Getter方法用于获取(读取)对象的属性值。
Setter方法用于设置(修改)对象的属性值。
示例:
public class Person {
// 私有属性
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter方法
public String getName() {
return name;
}
// Setter方法
public void setName(String name) {
this.name = name;
}
// Getter方法
public int getAge() {
return age;
}
// Setter方法,可以添加验证逻辑
public void setAge(int age) {
if (age > 0) {
this.age = age;
} else {
System.out.println("Age must be positive.");
}
}
// 展示Person信息的方法
public void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
public static void main(String[] args) {
Person person = new Person("Alice", 30);
person.displayInfo();
// 使用setter方法修改属性
person.setAge(25);
person.setName("Bob");
person.displayInfo();
// 尝试设置无效的年龄
person.setAge(-5);
person.displayInfo(); // 年龄不会改变
}
}