Java入门第30课:封装、private、getter/setter
一、学习目标
- 理解面向对象三大特性之一:封装的含义与好处
- 掌握 private 私有访问修饰符作用
- 熟练编写 get、set 方法操作私有成员变量
- 在 set 方法中增加数据合法性校验
- 分清四种访问修饰符简单区别
二、封装思想
1. 为什么需要封装?
之前代码中成员变量直接暴露,外部可以随意修改:
java运行
Student s = new Student(); s.age = -50; // 年龄负数,数据非法,代码无法拦截封装核心:隐藏对象内部细节,仅对外提供安全访问入口。 实现思路:
- 使用
private修饰成员变量,外部无法直接访问 - 提供公共 get/set 方法,通过方法读写变量,中间可校验数据
2. 封装三大好处
- 安全性:在 set 方法校验数据,过滤非法值
- 代码复用:读写逻辑统一放在方法,多处调用不用重复写
- 简化调用:使用者不用关心内部实现,只调用提供的方法
三、private 关键字(私有修饰符)
- 修饰成员变量、成员方法
- 作用范围:仅当前类内部可见,其他类完全无法访问
java运行
public class Student { // 私有变量,外部类不能直接 s.age private String name; private int age; }测试类直接访问会编译报错:
java运行
public class Test { public static void main(String[] args) { Student s = new Student(); s.age = 18; // 报错:age是private } }四、getter、setter 标准写法
规则
- set 方法:给变量赋值,无返回值,参数和变量类型一致 格式:
public void setXxx(类型 参数) - get 方法:获取变量值,无参数,返回值和变量类型一致 格式:
public 类型 getXxx() - boolean 类型变量 get 方法推荐用
isXxx()
完整学生类示例
java运行
public class Student { // 私有成员变量 private String name; private int age; // name 的 set方法 public void setName(String name) { this.name = name; } // name 的 get方法 public String getName() { return this.name; } // age 的 set方法(增加数据校验) public void setAge(int age) { // 合法年龄 0~120 if (age >= 0 && age <= 120) { this.age = age; } else { System.out.println("年龄输入不合法,赋值失败"); this.age = 0; } } // age 的 get方法 public int getAge() { return this.age; } // 展示信息方法 public void show() { System.out.println("姓名:" + name + ",年龄:" + age); } }测试类使用
java运行
public class TestStudent { public static void main(String[] args) { Student s = new Student(); // 设置值 s.setName("小明"); s.setAge(20); // 获取值 System.out.println(s.getName()); System.out.println(s.getAge()); s.show(); // 传入非法年龄 s.setAge(-10); System.out.println(s.getAge()); } }运行结果:
plaintext
小明 20 姓名:小明,年龄:20 年龄输入不合法,赋值失败 0五、带构造方法 + 封装综合案例
java运行
public class Person { private String name; private int age; // 无参构造 public Person(){} // 有参构造 public Person(String name, int age) { this.name = name; // 构造中赋值也调用set,复用校验逻辑 setAge(age); } // get set public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { if(age >= 0 && age <=150){ this.age = age; }else{ System.out.println("年龄非法"); } } public int getAge() { return age; } public void info(){ System.out.println(name + "," + age + "岁"); } }六、四种访问修饰符简单认知(本课拓展)
表格
| 修饰符 | 本类 | 同包 | 子类 | 任意类 |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| 默认 (不写) | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
本课重点只用private和public。
七、常见易错点
- 私有变量直接用对象。变量访问 → 编译报错,必须走 get/set
- set 方法忘记做数据校验,失去封装安全意义
- get/set 方法大小写错误:变量 age → setAge,不是 setage
- boolean 类型变量:private boolean sex; 推荐
isSex()而非 getSex ()
八、课堂练习
- 定义手机类 Phone,私有属性 brand 品牌、price 价格
- 编写 get、set 方法,价格不能小于 0,小于 0 则提示价格非法
- 创建对象,通过 set 赋值,get 打印信息
九、课后作业
- 定义 Dog 类,私有 name 名字、int age、boolean isPet 宠物
- 完善全套 get/set,age 限制 0~20
- 写有参构造,调用 set 方法赋值,编写 show 方法输出全部属性
本课总结
- 封装:隐藏内部数据,对外提供统一访问接口;
- private 修饰变量,外部无法直接访问;
- setXxx 赋值,可校验数据;getXxx 获取值;
- 封装核心价值:保护数据安全、统一控制逻辑
