|
|
@@ -142,6 +142,89 @@ bailus[i] = b;
|
|
|
|
|
|
---
|
|
|
|
|
|
+### 8. 封装(Encapsulation)
|
|
|
+
|
|
|
+**文件**:`Demo04.java`, `Person.java`, `PersonTest.java`
|
|
|
+
|
|
|
+#### 8.1 面向对象三大特性
|
|
|
+
|
|
|
+Java 面向对象有三大特性,本质上都是为了 **减少写代码、让代码能够复用**:
|
|
|
+
|
|
|
+| 特性 | 说明 |
|
|
|
+|------|------|
|
|
|
+| **封装** | 把该隐藏的隐藏起来,把该显示的显示出来 |
|
|
|
+| **继承** | 子类自动拥有父类的成员,实现代码复用 |
|
|
|
+| **多态** | 同一行为在不同对象上产生不同效果 |
|
|
|
+
|
|
|
+#### 8.2 为什么要封装
|
|
|
+
|
|
|
+**问题场景**:如果类的属性直接暴露,可以随意赋值,可能导致不符合业务逻辑的数据。
|
|
|
+
|
|
|
+```java
|
|
|
+Person p = new Person();
|
|
|
+p.age = 250; // 语法正确,但业务上不合理(人的年龄不可能250岁)
|
|
|
+p.age = -250000; // 同样不合理
|
|
|
+```
|
|
|
+
|
|
|
+**解决方案(封装两步走)**:
|
|
|
+
|
|
|
+```
|
|
|
+第一步:把属性的权限提高,让【本类以外】都无法直接访问(赋值、取值)
|
|
|
+ → 使用 private 关键字
|
|
|
+
|
|
|
+第二步:定义公开(public)的方法来赋值和取值
|
|
|
+ → setXxx() 方法:赋值,内部做合法性判断
|
|
|
+ → getXxx() 方法:取值
|
|
|
+```
|
|
|
+
|
|
|
+#### 8.3 访问权限修饰符
|
|
|
+
|
|
|
+| 修饰符 | 含义 | 访问范围 |
|
|
|
+|--------|------|---------|
|
|
|
+| `public` | 公开的、公共的 | 任何地方的任何类都能访问 |
|
|
|
+| `private` | 私有的、个人的 | 除了自身所在的类之外,任何类都不能访问 |
|
|
|
+
|
|
|
+#### 8.4 封装的标准实现 —— setter/getter
|
|
|
+
|
|
|
+```java
|
|
|
+public class Person {
|
|
|
+ String name;
|
|
|
+ private int age; // 私有化:本类以外无法直接访问
|
|
|
+
|
|
|
+ // 公开的赋值方法(setter)—— 带合法性校验
|
|
|
+ public void setAge(int newAge) {
|
|
|
+ if (newAge >= 1 && newAge < 130) {
|
|
|
+ age = newAge;
|
|
|
+ } else {
|
|
|
+ System.out.println("年龄超过规定限制,赋值无效...");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 公开的取值方法(getter)
|
|
|
+ public int getAge() {
|
|
|
+ return age;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 8.5 测试封装效果
|
|
|
+
|
|
|
+```java
|
|
|
+public class PersonTest {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Person p = new Person();
|
|
|
+ p.name = "张三";
|
|
|
+ p.setAge(200); // 赋值无效:年龄超过限制
|
|
|
+ int age = p.getAge(); // 获取到的 age 是默认值 0
|
|
|
+ System.out.println(age); // 输出:0
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **封装的核心思想**:隐藏功能的实现细节,仅暴露功能的调用方式。就像 USB 接口,用户只需插拔,不需关心内部电路。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
## 二、代码实战:类与对象完整示例
|
|
|
|
|
|
### 1. Student 学生类
|
|
|
@@ -369,6 +452,52 @@ public class Test02 {
|
|
|
|
|
|
---
|
|
|
|
|
|
+### 6. 封装实战——Person 类
|
|
|
+
|
|
|
+**文件**:`Person.java`, `PersonTest.java`
|
|
|
+
|
|
|
+完整演示封装的标准实现:私有化属性 + setter/getter 方法。
|
|
|
+
|
|
|
+**实体类(Person.java)**:
|
|
|
+
|
|
|
+```java
|
|
|
+public class Person {
|
|
|
+ String name; // 公开属性
|
|
|
+ private int age; // 私有属性:外部不能直接访问
|
|
|
+
|
|
|
+ // setter:赋值 + 合法性校验
|
|
|
+ public void setAge(int newAge) {
|
|
|
+ if (newAge >= 1 && newAge < 130) {
|
|
|
+ age = newAge;
|
|
|
+ } else {
|
|
|
+ System.out.println("年龄超过规定限制,赋值无效...");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // getter:取值
|
|
|
+ public int getAge() {
|
|
|
+ return age;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**测试类(PersonTest.java)**:
|
|
|
+
|
|
|
+```java
|
|
|
+public class PersonTest {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Person p = new Person();
|
|
|
+ p.name = "张三"; // 公开属性可以直接赋值
|
|
|
+ p.setAge(200); // 通过 setter 赋值(会校验)
|
|
|
+ int age = p.getAge(); // 通过 getter 取值
|
|
|
+ System.out.println(age); // 输出 0(因为赋值无效,age 保持默认值)
|
|
|
+ // p.age = 20; // 编译错误:age 是 private 的,外部无法直接访问
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
## 三、随堂练习
|
|
|
|
|
|
> 以下练习在 `Demo02.java` 和 `Demo03.java` 中以注释形式列出,作为课后实现任务。
|
|
|
@@ -419,6 +548,14 @@ public class Test02 {
|
|
|
- 自行车类(`Bike`):车型属性 + `ride()` 方法
|
|
|
- 测试类:1 个汽车对象 + 10 辆自行车对象数组
|
|
|
|
|
|
+### 练习 8:封装练习——学生年龄校验
|
|
|
+
|
|
|
+参照 `Person` 类的封装方式,创建一个 `StudentV2` 类:
|
|
|
+- **属性**:姓名(`name`,公开)、年龄(`age`,私有)
|
|
|
+- **要求**:通过 setter 赋值时,年龄必须在 6~35 岁之间(含边界),否则提示"年龄超出学生范围,赋值无效"
|
|
|
+- **提供** `getAge()` 方法获取年龄
|
|
|
+- **测试类**:创建对象,分别测试合法年龄和非法年龄的赋值效果
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 四、知识点总结
|
|
|
@@ -438,6 +575,9 @@ public class Test02 {
|
|
|
| 11 | 对象数组 | 数组元素类型为类名,存储对象引用地址 | `Test01.java`, `Test02.java` |
|
|
|
| 12 | 循环创建对象并存入数组 | for 循环中 `new` 对象,赋值给数组元素 | `Test01.java`, `Test02.java` |
|
|
|
| 13 | 多个类协同建模 | 将现实场景(古诗/交通)抽象为多个类 | `HuangLi.java`, `BaiLu.java`, `Car.java`, `Bike.java` |
|
|
|
+| 14 | 封装(Encapsulation) | 面向对象三大特性之一,隐藏实现细节,暴露调用方式 | `Demo04.java` |
|
|
|
+| 15 | `private` 关键字 | 私有权限修饰符,本类以外无法访问 | `Person.java` |
|
|
|
+| 16 | setter/getter 方法 | 对外提供公有方法赋值/取值,可做合法性校验 | `Person.java`, `PersonTest.java` |
|
|
|
|
|
|
---
|
|
|
|