Просмотр исходного кода

docs: 更新20260720课堂笔记,同步代码变更——新增封装(private/setter/getter、面向对象三大特性、合法性校验)

WanJL 1 день назад
Родитель
Сommit
cf6e8a9600

+ 1 - 1
README.md

@@ -41,5 +41,5 @@
 | 2026-07-15 | switch分支、循环结构与数组 | `c260715` | [默认包](./授课代码/c260715/src/) |
 | 2026-07-16 | 多维数组、forEach、Arrays工具类、三种排序算法(冒泡/选择/插入)与 Scanner 键盘输入 | `c260716` | [默认包](./授课代码/c260716/src/) |
 | 2026-07-17 | Java方法4种声明方式、数组作为方法参数、Random随机数类、在线OJ编码模板、三种排序算法复习、Scanner学生信息采集系统(BMI计算) | `c260717` | [默认包](./授课代码/c260717/src/) |
-| 2026-07-20 | 面向对象基础:类与对象、成员变量与成员方法、创建对象与使用成员、对象地址输出、成员变量 vs 局部变量、对象引用与内存共享、对象数组、循环创建对象并存入数组、多个类协同建模(古诗场景/交通场景) | `c260720` | [默认包](./授课代码/c260720/src/) |
+| 2026-07-20 | 面向对象基础:类与对象、成员变量与成员方法、创建对象与使用成员、对象地址输出、成员变量 vs 局部变量、对象引用与内存共享、对象数组、循环创建对象并存入数组、多个类协同建模(古诗场景/交通场景)、封装(private/setter/getter) | `c260720` | [默认包](./授课代码/c260720/src/) |
 

+ 54 - 0
授课代码/c260720/src/Demo04.java

@@ -0,0 +1,54 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo04
+ * @description 封装
+ * @create 2026/7/20
+ */
+public class Demo04 {
+    /*
+        面向对象的三大特性:
+        本质上就是减少写代码
+        为了让代码能够复用
+        封装
+        继承
+        多态
+
+        我们先讲第1个:封装
+
+        封装的含义和思想:
+            把该隐藏的隐藏起来,把该显示的显示出来。
+            隐藏的是功能的实现细节
+            显示的是功能的调用方式
+
+            比如:USB插口,就是一个非常典型的封装
+            或可以理解为  自己 组装电脑 和 买 一体机 笔记本电脑
+
+            比如有个 Person类
+            public class Person{    //程序 服务
+                String name;
+                int age;
+            }
+            public static void main(String[] args){//是我们站在用户的角度对程序进行测试的
+                //创建Person对象
+                Person p=new Person();
+                p.name="张三";
+                p.age=250;
+                // p.age==-250000;虽然代码编译正确,但是不符合现实业务逻辑
+
+                //所以就出现了封装
+                解决的方案有两步:
+                    1、 把 age属性的权限提高,让【本类以外】的都无法访问(赋值、取值)
+                    2、 定义一个为age属性赋值的方法,这个方法是所有人都能访问的,但是方法内要做判断
+                        age<1  || age>130 都不允许赋值,赋值都无效
+                    3、定义一个获取age属性的方法,这个方法是所有人都能访问
+            }
+            Java的封装,提供了几个关键字,名叫【访问权限修饰符】
+                public 公开的公共的, 使用public修饰的变量和方法,任何地方的任何类都能访问。
+                private 私人的是有的,使用private修饰的变量和方法,除了自身之外的任何类都不能访问。
+
+
+
+
+     */
+}

+ 34 - 0
授课代码/c260720/src/Person.java

@@ -0,0 +1,34 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Person
+ * @description
+ * @create 2026/7/20
+ */
+public class Person{    //程序 服务
+    String name;
+    //给age设置为私有private。除了本类之外的任何类都不能访问
+    private int age;
+
+    //定义一个public修饰的用来给age赋值的方法
+
+    /**
+     * 为age赋值的方法
+     * @param newAge
+     */
+    public void setAge(int newAge){
+        if (newAge>=1&&newAge<130){
+            age=newAge;
+        }else {
+            System.out.println("年龄超过规定限制,赋值无效...");
+        }
+    }
+
+    /**
+     * 获取age属性的方法
+     * @return
+     */
+    public int getAge(){
+        return age;
+    }
+}

+ 16 - 0
授课代码/c260720/src/PersonTest.java

@@ -0,0 +1,16 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title PersonTest
+ * @description
+ * @create 2026/7/20
+ */
+public class PersonTest {
+    public static void main(String[] args) {
+        Person p=new Person();
+        p.name="张三";
+        p.setAge(200);
+        int age=p.getAge();
+        System.out.println(age);
+    }
+}

+ 140 - 0
课堂笔记/01-JavaSE基础-笔记/20260720-笔记.md

@@ -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` |
 
 ---