封装与访问控制
在理解了类与对象的基本概念后,我们来学习面向对象编程的第一个重要特性:封装。封装是面向对象编程的核心特性之一,它将数据和方法捆绑在一起,并对外部隐藏实现细节。访问控制则是实现封装的重要机制。
作用
封装和访问控制可以:
- 保护数据不被外部直接访问和修改,提高代码的安全性
- 隐藏实现细节,提供良好的接口,降低代码的耦合度
- 提高代码的可维护性和安全性,便于后期修改和维护
- 实现数据验证和业务逻辑控制,确保数据的正确性
例子
public class Student {
// 私有属性,实现数据隐藏
private String name;
private int age;
private double score;
// 构造方法,初始化对象
public Student(String name, int age) {
this.name = name;
this.age = age;
this.score = 0.0;
}
// Getter方法,提供受控的访问
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getScore() {
return score;
}
// Setter方法,实现数据验证
public void setScore(double score) {
if (score >= 0 && score <= 100) {
this.score = score;
} else {
System.out.println("分数必须在0-100之间");
}
}
// 业务方法,封装业务逻辑
public String getGrade() {
if (score >= 90) return "A";
if (score >= 80) return "B";
if (score >= 70) return "C";
if (score >= 60) return "D";
return "F";
}
}
public class Main {
public static void main(String[] args) {
// 创建学生对象
Student student = new Student("张三", 18);
// 使用getter方法获取信息
System.out.println("姓名:" + student.getName());
System.out.println("年龄:" + student.getAge());
// 使用setter方法设置分数
student.setScore(85);
System.out.println("分数:" + student.getScore());
System.out.println("等级:" + student.getGrade());
// 尝试设置无效分数,展示数据验证
student.setScore(150);
}
}
详细说明
-
访问修饰符:
- private:仅本类可见,实现最严格的封装
- default:本类和同包可见,适用于包内共享
- protected:本类、同包和子类可见,为继承做准备
- public:所有类可见,用于对外接口
-
封装原则:
- 将属性设为私有,防止外部直接访问
- 提供公共的访问方法,控制数据访问
- 在方法中添加数据验证,确保数据正确性
- 隐藏实现细节,只暴露必要接口
-
最佳实践:
- 优先使用private修饰属性,实现严格封装
- 通过getter/setter控制访问,实现数据验证
- 在setter中进行数据验证,确保数据有效性
- 提供必要的业务方法,封装业务逻辑
注意事项
- 属性通常使用private修饰,实现数据隐藏
- 构造方法通常使用public修饰,允许对象创建
- 方法根据实际需求选择合适的访问级别
- 避免过度封装导致代码复杂
- 注意包级别的访问控制,合理使用default修饰符