Java基础-21-基本语法-封装

封装(Encapsulation)

1. 什么是封装?

封装(Encapsulation)是面向对象编程(OOP)中的一个重要特性。它指的是将对象的属性和行为 封装在一个类中,并提供访问控制机制,防止外部直接访问对象的内部数据,而是通过**公共方法(getter 和 setter)**来访问和修改数据。

封装的核心思想:

  • 隐藏对象的实现细节,只暴露必要的接口。

  • 控制数据的访问权限,防止外部程序对对象的数据进行非法操作。

  • 提高代码的可维护性和安全性


2. 封装的实现方式

封装通常通过以下方式来实现:

  1. 使用 private****关键字修饰成员变量,限制外部直接访问。

  2. 提供 public****关键字的 getter 和 setter 方法,让外部可以通过这些方法访问和修改变量。

  3. 在 setter 方法中添加逻辑,确保数据的安全性。

  4. 可以使用 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

在上面的示例中:

  • nameageprivate 的,外部无法直接访问。

  • 通过 getName()getAge() 方法获取值。

  • 通过 setAge() 方法修改值,并在方法中添加校验逻辑,确保数据合法。


5. 封装的优点

  1. 数据安全性:防止数据被随意修改,提高安全性。

  2. 提高代码复用性:通过 setter 方法可以加入数据校验逻辑,避免重复代码。

  3. 降低耦合性:外部不需要知道类的内部实现,只需调用公开的方法。

  4. 便于维护和修改:可以在不影响外部调用的情况下修改类的内部实现。


6. 适用场景

  • 数据保护:防止数据被外部随意修改(如银行账户余额)。

  • 约束输入:在 setter 方法中添加数据校验逻辑。

  • 隐藏复杂性:让外部只关注如何使用,而不需要关心实现细节。

  • 框架开发:如 Spring 框架中的 Java Bean 规范,要求使用 private 变量+getter/setter。


7. 总结

封装是 Java 面向对象编程的三大特性之一,主要通过私有化成员变量 ,并提供公共的 getter 和 setter 方法来访问它们,从而提高数据安全性和程序的健壮性。

掌握封装的概念并在实际开发中应用,有助于写出更安全、可维护、低耦合的代码。

相关推荐
纪元A梦11 小时前
贪心算法应用:信用评分分箱问题详解
java·算法·贪心算法
Swift社区11 小时前
如何解决 Vue2 前端项目为何无法访问本地资源(chunk.js 加载一直 pending/转圈)
开发语言·前端·javascript
大飞pkz12 小时前
【设计模式】题目小练2
开发语言·设计模式·c#·题目小练
啟明起鸣12 小时前
【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
服务器·c语言·开发语言·网络·tcp/ip·udp
007php00712 小时前
Redis高级面试题解析:深入理解Redis的工作原理与优化策略
java·开发语言·redis·nginx·缓存·面试·职场和发展
九章云极AladdinEdu12 小时前
深度学习优化器进化史:从SGD到AdamW的原理与选择
linux·服务器·开发语言·网络·人工智能·深度学习·gpu算力
axban12 小时前
QT M/V架构开发实战:QStandardItemModel介绍
开发语言·数据库·qt
Yeats_Liao12 小时前
Spring缓存(二):解决缓存雪崩、击穿、穿透问题
java·spring·缓存
猿究院-赵晨鹤12 小时前
String、StringBuffer 和 StringBuilder 的区别
java·开发语言
I'm a winner12 小时前
第五章:Python 数据结构:列表、元组与字典(一)
开发语言·数据结构·python