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

docs: 更新20260720课堂笔记,同步代码变更——新增this关键字、default/protected权限修饰符、封装原则与好处、Product商品类封装实战

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

+ 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 局部变量、对象引用与内存共享、对象数组、循环创建对象并存入数组、多个类协同建模(古诗场景/交通场景)、封装(private/setter/getter) | `c260720` | [默认包](./授课代码/c260720/src/) |
+| 2026-07-20 | 面向对象基础:类与对象、成员变量与成员方法、创建对象与使用成员、对象地址输出、成员变量 vs 局部变量、对象引用与内存共享、对象数组、循环创建对象并存入数组、多个类协同建模(古诗场景/交通场景)、封装(private/setter/getter/this关键字/权限修饰符) | `c260720` | [默认包](./授课代码/c260720/src/) |
 

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

@@ -47,8 +47,29 @@ public class Demo04 {
                 public 公开的公共的, 使用public修饰的变量和方法,任何地方的任何类都能访问。
                 private 私人的是有的,使用private修饰的变量和方法,除了自身之外的任何类都不能访问。
 
+            练习:
+                1、 补全Person类,为name 修饰private,并配置set和get方法
+                2、 创建 Product 商品类,定义私有成员变量 品牌、名称、价格、数量 并对每个成员变量设置赋值和取值的方法
+                3、 创建Bird 类,定义私有成员变量 3个,并对每个成员变量设置赋值和取值的方法
 
 
+            封装的思想:
+                封装 是面向对象的三大特征之一(封装、继承、多态)
+                是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部,外界是无法操作的。
+            封装的原则:
+                是把类的某些属性信息隐藏在类的内部,不允许外部程序直接访问,
+                而是通过该类提供的方法来实现对隐藏信息的操作和访问。
+                成员变量使用private修饰,让自身以外任何类都无法访问
+                成员方法使用public修饰,让任何类都能访问,不过在方法内部加以控制和增加业务逻辑
+            封装的好处:
+                通过方法来控制成员变量的操作,提高了代码的安全性
+                把代码用方法进行封装,提高了代码的复用性。
 
+            封装在Java中主要的体现就是为 类的成员 设置 【访问权限修饰符】
+
+                public 公开的公共的, 使用public修饰的变量和方法,任何地方的任何类都能访问。
+                private 私人的私有的,使用private修饰的变量和方法,除了自身之外的任何类都不能访问。
+                default 默认的       不使用任何修饰符修饰的变量和方法,本类中、同包中可以访问。
+                protected 本类中、同包中可以访问。非同包的子类可以访问,等到讲继承的时候再说
      */
 }

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

@@ -9,8 +9,8 @@ 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);
+        p.setAge(200);  //赋值
+        int age=p.getAge(); //取值
+        System.out.println(age);    //把取到的年龄输出
     }
 }

+ 70 - 0
授课代码/c260720/src/Product.java

@@ -0,0 +1,70 @@
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Product
+ * @description 商品类
+ * @create 2026/7/20
+ */
+public class Product {
+    /**
+     * 品牌
+     */
+    private String brand;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 价格
+     */
+    private double price;
+    /**
+     * 数量
+     */
+    private int count;
+
+    /**
+     * 为商品品牌赋值
+     * @param newBrand
+     */
+    public void setBrand(String brand){
+        //如果 方法参数 使用的是brand(方法参数也属于局部变量) 和成员变量名相同,
+        // 在当前方法中,按照就近原则,会都使用的是局部变量,而不是使用成员变量
+        //所以,要么就为局部变量设置新的变量名。
+        //要么就使用this关键字, 通过this关键字调用的变量是当前对象的成员变量。调用的方法是当前对象的成员方法。
+        //this主要的作用就是区分同名的成员变量和局部变量。使用this调用的就一定是成员变量
+        // 我 me 俺 寡人 孤 洒家
+        this.brand=brand;
+    }
+
+    /**
+     * 获取商品的品牌
+     * @return
+     */
+    public String getBrand(){
+        return brand;
+    }
+
+    public void setName(String name){
+        this.name=name;
+    }
+    public String getName(){
+        return this.name;
+    }
+
+    public double getPrice() {
+        return price;
+    }
+
+    public void setPrice(double price) {
+        this.price = price;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+}

+ 114 - 7
课堂笔记/01-JavaSE基础-笔记/20260720-笔记.md

@@ -181,8 +181,10 @@ p.age = -250000;  // 同样不合理
 
 | 修饰符 | 含义 | 访问范围 |
 |--------|------|---------|
-| `public` | 公开的、公共的 | 任何地方的任何类都能访问 |
-| `private` | 私有的、个人的 | 除了自身所在的类之外,任何类都不能访问 |
+| `public` | 公开的 | 任何地方的任何类都能访问 |
+| `private` | 私有的 | 除了自身所在的类之外,任何类都不能访问 |
+| `default`(默认) | 默认的 | 本类中、同包中可以访问(不写任何修饰符) |
+| `protected` | 受保护的 | 本类中、同包中可以访问,非同包的子类可以访问(讲继承时再细说) |
 
 #### 8.4 封装的标准实现 —— setter/getter
 
@@ -223,6 +225,49 @@ public class PersonTest {
 
 > **封装的核心思想**:隐藏功能的实现细节,仅暴露功能的调用方式。就像 USB 接口,用户只需插拔,不需关心内部电路。
 
+#### 8.6 `this` 关键字
+
+**文件**:`Product.java`
+
+当方法参数(局部变量)与成员变量**同名**时,按照**就近原则**,方法内部默认使用的是局部变量。此时需要用 `this` 关键字来区分。
+
+```java
+public class Product {
+    private String brand;   // 成员变量
+
+    // 参数 brand 与成员变量 brand 同名
+    public void setBrand(String brand) {
+        // this.brand 是成员变量,brand 是局部变量(方法参数)
+        this.brand = brand;
+    }
+}
+```
+
+> **`this` 的含义**:当前对象的引用。`this.成员变量` 调用的一定是当前对象的成员变量,`this.成员方法()` 调用的一定是当前对象的成员方法。
+
+**使用 `this` 的标准 getter/setter 写法**:
+
+```java
+public void setName(String name) {
+    this.name = name;       // this 区分成员变量和参数
+}
+public String getName() {
+    return this.name;       // 此处可以省略 this(无同名冲突),但加上更清晰
+}
+```
+
+#### 8.7 封装的原则与好处
+
+**封装的原则**:
+- 类的某些属性信息隐藏在类的内部,不允许外部程序直接访问
+- 通过该类提供的 **公有方法** 来实现对隐藏信息的操作和访问
+- 成员变量使用 `private` 修饰,成员方法使用 `public` 修饰
+
+**封装的好处**:
+1. **安全性**:通过方法控制成员变量的操作,可增加校验逻辑,防止非法数据
+2. **复用性**:把代码用方法封装起来,可以重复调用
+3. **隐藏细节**:使用者只需调用方法,不需要了解内部实现
+
 ---
 
 ## 二、代码实战:类与对象完整示例
@@ -498,9 +543,57 @@ public class PersonTest {
 
 ---
 
+### 7. 封装实战②——Product 商品类(this 关键字示范)
+
+**文件**:`Product.java`
+
+完整的商品封装类,包含 4 个私有属性,每个属性都有标准的 getter/setter,并在参数与成员变量同名时使用 `this` 关键字。
+
+```java
+public class Product {
+    private String brand;   // 品牌
+    private String name;    // 名称
+    private double price;   // 价格
+    private int count;      // 数量
+
+    // setter/getter —— 使用 this 区分同名参数和成员变量
+    public void setBrand(String brand) {
+        this.brand = brand;  // this.brand 是成员变量,brand 是参数
+    }
+    public String getBrand() {
+        return brand;        // 无同名冲突,this 可省略
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public String getName() {
+        return this.name;    // 加上 this 更清晰
+    }
+
+    public void setPrice(double price) {
+        this.price = price;
+    }
+    public double getPrice() {
+        return price;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+    public int getCount() {
+        return count;
+    }
+}
+```
+
+> **要点**:当 setter 参数名与成员变量名一致时,`this` **不能省略**,否则方法内使用的都是局部变量,赋值无效。
+
+---
+
 ## 三、随堂练习
 
-> 以下练习在 `Demo02.java` 和 `Demo03.java` 中以注释形式列出,作为课后实现任务。
+> 以下练习在 `Demo02.java`、`Demo03.java` 和 `Demo04.java` 中以注释形式列出,作为课后实现任务。
 
 ### 练习 1:教师类完整定义
 
@@ -556,6 +649,18 @@ public class PersonTest {
 - **提供** `getAge()` 方法获取年龄
 - **测试类**:创建对象,分别测试合法年龄和非法年龄的赋值效果
 
+### 练习 9:补全 Person 类的 name 封装(Demo04 练习)
+
+在已有 `Person` 类基础上,为 `name` 属性也添加 `private` 修饰,并配置对应的 setter/getter 方法。
+
+### 练习 10:创建 Bird 类(Demo04 练习)
+
+创建 `Bird` 类,定义 **3 个私有成员变量**,并对每个成员变量设置赋值和取值的方法(getter/setter),要求参数名与成员变量同名时使用 `this` 关键字。
+
+### 练习 11:创建 Product 测试类
+
+为 `Product` 类创建测试类 `ProductTest`,创建商品对象并通过 setter 赋值,通过 getter 输出所有属性值。
+
 ---
 
 ## 四、知识点总结
@@ -578,13 +683,15 @@ public class PersonTest {
 | 14 | 封装(Encapsulation) | 面向对象三大特性之一,隐藏实现细节,暴露调用方式 | `Demo04.java` |
 | 15 | `private` 关键字 | 私有权限修饰符,本类以外无法访问 | `Person.java` |
 | 16 | setter/getter 方法 | 对外提供公有方法赋值/取值,可做合法性校验 | `Person.java`, `PersonTest.java` |
+| 17 | `this` 关键字 | 区分同名的成员变量和局部变量,指向当前对象 | `Product.java` |
+| 18 | `default` 权限修饰符 | 默认访问权限,同包中可以访问 | `Demo04.java` |
+| 19 | `protected` 权限修饰符 | 受保护权限,同包+非同包子类可以访问 | `Demo04.java` |
 
 ---
 
 ## 五、拓展阅读
 
 1. **构造方法**:`new 类名()` 实际上是调用类的构造方法,默认有无参构造
-2. **封装性**:使用 `private` 关键字隐藏属性,通过 `getter/setter` 访问
-3. **this 关键字**:当成员变量与局部变量重名时,用 `this` 区分
-4. **匿名对象**:`new Student().study();` —— 没有名字的对象,用后即弃
-5. **null 与 NullPointerException**:引用变量可以不指向任何对象(`null`),调用该引用的成员会报空指针异常
+2. **匿名对象**:`new Student().study();` —— 没有名字的对象,用后即弃
+3. **null 与 NullPointerException**:引用变量可以不指向任何对象(`null`),调用该引用的成员会报空指针异常
+4. **封装 vs 继承 vs 多态**:三大特性后续会深入学习,继承实现代码复用,多态实现灵活扩展