|
|
@@ -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 多态**:三大特性后续会深入学习,继承实现代码复用,多态实现灵活扩展
|