欢迎光临
我们一直在努力

Java的面向对象:封装详解(0基础入门版)

一、什么是封装?用大白话讲清楚

先给新手一个最通俗的定义:
封装 = 把东西装起来 + 给个规矩用
就像你用的手机:

  • 内部的芯片、电池、电路板都被装在手机壳里(藏起来,不让你直接碰)
  • 你只用通过屏幕、按键、充电口这些「指定接口」来使用手机(有规矩的用)
  • 就算你不懂内部原理,也能正常用;而且内部坏了,只要接口不变,不影响你使用

对应到Java里:

  • 「手机内部零件」= 类的属性(变量)和方法(函数)
  • 「手机壳」= 访问修饰符(private)
  • 「指定接口」= getter/setter方法、公开的业务方法

核心目的:

  • 保护数据安全,避免随意修改导致错误
  • 降低使用难度,使用者不用关心内部实现
  • 提高代码可维护性,修改内部逻辑不影响外部使用
  • 二、为什么需要封装?反例先看明白

    先写一个「未封装」的错误示范,新手一看就知道问题在哪:

    // 未封装的学生类 – 新手常犯的错误
    public class Student {
    // 直接把属性暴露出来,任何人都能随意修改
    String name;
    int age;

    // 主方法测试
    public static void main(String[] args) {
    Student stu = new Student();
    // 问题1:年龄可以被随意设置成不合理的值(比如-18)
    stu.age = 18;
    // 问题2:姓名可以被设置成空字符串
    stu.name = "";

    // 输出结果:姓名:,年龄:-18 (明显不符合逻辑)
    System.out.println("姓名:" + stu.name + ",年龄:" + stu.age);
    }
    }

    运行结果:

    姓名:,年龄:-18

    问题分析:

    • 数据无保护:年龄是负数、姓名为空,程序也能运行,这在实际开发中会导致严重bug
    • 代码无规范:任何人都能直接修改属性,没有统一的校验规则
    • 后期难维护:如果要给年龄加校验,需要改所有用到stu.age的地方

    三、封装的核心实现步骤(新手必记)

    封装就3个核心步骤,一步都不能少:

  • 私有化属性:用private修饰类的属性,让外部无法直接访问
  • 提供公开方法:写getXxx()(获取值)和setXxx()(设置值)方法
  • 添加逻辑校验:在setXxx()方法里加数据合法性判断
  • 四、封装的完整代码示例(带详细注释)

    // 封装后的学生类 – 新手可以直接复制运行
    public class Student {
    // 1. 私有化属性:用private修饰,外部无法直接访问
    // 姓名
    private String name;
    // 年龄
    private int age;

    // 2. 提供公开的getter方法:获取属性值
    // 获取姓名
    public String getName() {
    // 直接返回私有属性name的值
    return this.name;
    }

    // 获取年龄
    public int getAge() {
    return this.age;
    }

    // 3. 提供公开的setter方法:设置属性值,带逻辑校验
    // 设置姓名
    public void setName(String name) {
    // 校验:姓名不能为空且长度不能超过10
    if (name == null || name.trim().isEmpty()) {
    System.out.println("错误:姓名不能为空!");
    return; // 不执行赋值操作
    }
    if (name.length() > 10) {
    System.out.println("错误:姓名长度不能超过10个字符!");
    return;
    }
    // 校验通过,才给私有属性赋值
    this.name = name;
    }

    // 设置年龄
    public void setAge(int age) {
    // 校验:年龄必须在0-150之间
    if (age < 0 || age > 150) {
    System.out.println("错误:年龄必须在0-150之间!");
    return; // 不执行赋值操作
    }
    this.age = age;
    }

    // 可选:提供一个展示学生信息的方法(封装业务逻辑)
    public void showInfo() {
    System.out.println("学生信息:");
    System.out.println("姓名:" + this.name);
    System.out.println("年龄:" + this.age);
    }

    // 主方法:测试封装效果
    public static void main(String[] args) {
    // 创建学生对象
    Student stu = new Student();

    // 测试1:设置非法值
    stu.setName(""); // 空姓名,会提示错误
    stu.setAge(18); // 负年龄,会提示错误

    // 测试2:设置合法值
    stu.setName("张三");
    stu.setAge(20);

    // 展示正确的学生信息
    stu.showInfo();

    // 测试3:获取属性值(只能通过getter方法)
    String stuName = stu.getName();
    int stuAge = stu.getAge();
    System.out.println("\\n通过getter获取:姓名=" + stuName + ",年龄=" + stuAge);

    // 错误示范:直接访问私有属性(编译报错!)
    // stu.name = "李四"; // 这行代码会报错,因为name是private的
    // stu.age = 25; // 同理,直接访问age也会报错
    }
    }

    代码运行结果

    错误:姓名不能为空!
    错误:年龄必须在0-150之间!
    学生信息:
    姓名:张三
    年龄:20

    通过getter获取:姓名=张三,年龄=20

    五、核心知识点解释(新手必懂)

    1. 访问修饰符:private

    • private:表示「私有」,只有当前类内部能访问,外部类/主方法都不能直接用
    • 对比:如果不写修饰符(默认),属于「包访问权限」,其他包的类也能访问,不安全
    • 新手记住:封装属性时,第一步就是给属性加private

    2. getter/setter方法命名规则

    • getter方法:get + 属性名(首字母大写),比如getName()、getAge()
      • 返回值类型和属性类型一致
      • 无参数
    • setter方法:set + 属性名(首字母大写),比如setName()、setAge()
      • 返回值类型是void
      • 参数类型和属性类型一致

    3. this关键字的作用

    • this代表「当前对象」,简单说就是:区分方法参数和类的属性
    • 比如this.name = name;:
      • 左边this.name:类的私有属性name
      • 右边name:setName方法的参数name

    六、封装的实际应用场景(新手能理解)

  • 用户注册:校验手机号、密码格式(比如密码长度≥6),不符合就不让设置
  • 电商订单:订单状态(待付款、已发货)只能通过指定方法修改,不能直接改
  • 银行账户:余额只能通过存款/取款方法修改,不能直接赋值
  • 七、常见面试题(新手提前了解)

  • 问:封装的核心思想是什么?
    答:隐藏内部实现,暴露统一接口,保证数据安全性和代码可维护性。
  • 问:为什么要用private修饰属性?
    答:防止外部直接修改属性,避免数据不合法,同时便于统一管理属性的修改规则。
  • 问:getter/setter方法的作用?
    答:getter用于获取属性值,setter用于设置属性值并添加校验逻辑,是封装的核心实现方式。
  • 总结

  • 封装的核心是「藏起来(private)+ 规矩用(get/set)」,保护数据安全
  • 实现封装的三步:私有化属性 → 提供get/set方法 → 添加逻辑校验
  • 封装的好处:数据合法、代码易维护、使用者不用关心内部实现

  • 新手学习建议

  • 先复制代码运行,看清楚「未封装」和「封装」的区别
  • 自己修改校验规则(比如把年龄范围改成18-60),体会封装的灵活性
  • 尝试写一个「手机类」,封装品牌、价格属性,添加价格校验(不能为负数)
  • 赞(0)
    未经允许不得转载:171主机测评 » Java的面向对象:封装详解(0基础入门版)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址