跳转至

封装与访问控制

在理解了类与对象的基本概念后,我们来学习面向对象编程的第一个重要特性:封装。封装是面向对象编程的核心特性之一,它将数据和方法捆绑在一起,并对外部隐藏实现细节。访问控制则是实现封装的重要机制。

作用

封装和访问控制可以:

  • 保护数据不被外部直接访问和修改,提高代码的安全性
  • 隐藏实现细节,提供良好的接口,降低代码的耦合度
  • 提高代码的可维护性和安全性,便于后期修改和维护
  • 实现数据验证和业务逻辑控制,确保数据的正确性

例子

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);
    }
}

详细说明

  1. 访问修饰符:

    • private:仅本类可见,实现最严格的封装
    • default:本类和同包可见,适用于包内共享
    • protected:本类、同包和子类可见,为继承做准备
    • public:所有类可见,用于对外接口
  2. 封装原则:

    • 将属性设为私有,防止外部直接访问
    • 提供公共的访问方法,控制数据访问
    • 在方法中添加数据验证,确保数据正确性
    • 隐藏实现细节,只暴露必要接口
  3. 最佳实践:

    • 优先使用private修饰属性,实现严格封装
    • 通过getter/setter控制访问,实现数据验证
    • 在setter中进行数据验证,确保数据有效性
    • 提供必要的业务方法,封装业务逻辑

注意事项

  1. 属性通常使用private修饰,实现数据隐藏
  2. 构造方法通常使用public修饰,允许对象创建
  3. 方法根据实际需求选择合适的访问级别
  4. 避免过度封装导致代码复杂
  5. 注意包级别的访问控制,合理使用default修饰符