一、什么是封装?用大白话讲清楚
先给新手一个最通俗的定义:
封装 = 把东西装起来 + 给个规矩用
就像你用的手机:
- 内部的芯片、电池、电路板都被装在手机壳里(藏起来,不让你直接碰)
- 你只用通过屏幕、按键、充电口这些「指定接口」来使用手机(有规矩的用)
- 就算你不懂内部原理,也能正常用;而且内部坏了,只要接口不变,不影响你使用
对应到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个核心步骤,一步都不能少:
四、封装的完整代码示例(带详细注释)
// 封装后的学生类 – 新手可以直接复制运行
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
六、封装的实际应用场景(新手能理解)
七、常见面试题(新手提前了解)
答:隐藏内部实现,暴露统一接口,保证数据安全性和代码可维护性。
答:防止外部直接修改属性,避免数据不合法,同时便于统一管理属性的修改规则。
答:getter用于获取属性值,setter用于设置属性值并添加校验逻辑,是封装的核心实现方式。



