01-面向对象进阶(继承 / 多态 / 接口 / 代码块 / 枚举)
对应原始资料:
JavaSE进阶_day01~day03
一、继承(extends)
1. 作用与格式
子类继承父类,直接获得父类的非 private 成员,提高代码复用性。
java
class Animal {
public void eat() { System.out.println("吃"); }
}
class Dog extends Animal { // Dog 继承 Animal
public void lookHome() { ... }
}2. 继承的特点
- Java 只支持单继承,不支持多继承(一个子类只能有一个直接父类),但支持多层继承。
- 所有类的顶层父类是
Object。 - 子类不能继承父类的构造方法和 private 成员。
3. 成员访问特点
- 变量:就近原则(子类局部 → 子类成员 → 父类成员),用
super.变量访问父类。 - 构造:子类构造方法默认第一行
super(),调用父类无参构造。父类若没有无参构造,子类必须用super(参数)显式调用。 - 方法:子类可重写父类方法。
4. 方法重写(Override)
- 同名同参同返回,子类修饰符范围要 ≥ 父类。
@Override注解用于校验是否正确重写。- private / static / final 方法不能被重写。
二、this 与 super
| 关键字 | 指向 |
|---|---|
this | 当前子类对象引用 |
super | 父类对象引用(访问父类成员) |
java
class Zi extends Fu {
int num = 20;
public void show() {
int num = 30;
System.out.println(num); // 30 局部
System.out.println(this.num); // 20 子类成员
System.out.println(super.num); // 10 父类成员
}
}三、多态(Polymorphism)
1. 前提
- 继承 / 实现
- 方法重写
- 父类引用指向子类对象:
Fu f = new Zi();
2. 成员访问特点
- 成员变量:编译看左,运行看左(看父类)。
- 成员方法:编译看左,运行看右(看子类)—— 这就是多态。
- 静态方法:编译看左,运行看左(不算重写)。
3. 多态的好处与弊端
- 好处:提高扩展性,方法参数用父类类型可接收任意子类。
- 弊端:不能直接调用子类特有方法,需向下转型。
java
Animal a = new Dog(); // 向上转型(自动)
if (a instanceof Dog) {
Dog d = (Dog) a; // 向下转型(强转)
d.lookHome();
}4. 经典应用:USB 接口案例
用多态统一处理鼠标、键盘等外设(接口作参数)。
四、抽象类(abstract)
1. 特点
- 用
abstract修饰的类不能直接实例化。 - 可以有抽象方法(无方法体)和普通方法。
- 子类必须重写所有抽象方法,除非子类也是抽象类。
java
abstract class Animal {
public abstract void eat(); // 抽象方法
public void sleep() { ... } // 普通方法
}2. 抽象类 vs 普通类
- 抽象类强制子类重写,体现「模板思想」。
五、接口(interface)
1. 定义与实现
java
interface Inter {
int NUM = 10; // 常量:public static final
void show(); // 抽象方法:public abstract
default void defaultMethod() { } // 默认方法(JDK 8)
static void staticMethod() { } // 静态方法(JDK 8)
}
class InterImpl implements Inter {
public void show() { ... } // 实现抽象方法
}2. 接口的特点
- 接口可以多实现(一个类实现多个接口)。
- 接口之间可以多继承(一个接口继承多个接口)。
- JDK 8 引入的默认方法解决接口升级问题。
3. 抽象类 vs 接口
| 维度 | 抽象类 | 接口 |
|---|---|---|
| 关系 | 单继承 | 多实现 |
| 成员变量 | 任意 | 只能 public static final |
| 构造方法 | 有 | 无 |
| 成员方法 | 抽象 + 具体 | 抽象 + 默认 + 静态 |
| 设计理念 | "是什么"(同一类) | "能做什么"(规范/能力) |
经验:抽象类用于抽取同类事物的共性代码;接口用于定义行为规范,跨继承树复用。
六、代码块
1. 局部代码块
方法中 { },限制变量作用域(已很少用)。
2. 构造代码块
类中方法外 { },每次 new 对象前执行(优先于构造方法)。
3. 静态代码块
static { },类加载时执行一次,常用于初始化静态资源(配置、驱动)。
执行顺序:
- 静态代码块(只一次,按继承链从父到子)→ 构造代码块 → 构造方法。
- 父类静态 → 子类静态 → 父类构造块/构造 → 子类构造块/构造。
七、final 关键字
| 修饰 | 效果 |
|---|---|
final class | 不能被继承(如 String) |
final 方法 | 不能被重写 |
final 变量 | 只能赋值一次,是常量 |
final 引用类型 | 地址不能变,但对象内容可变 |
八、枚举(enum)
1. 用法
java
enum Season {
SPRING, SUMMER, AUTUMN, WINTER; // 第一行罗列实例
}
// 使用
Season s = Season.SPRING;2. 进阶(带属性的枚举)
java
enum Season {
SPRING("春"), SUMMER("夏");
private String name;
Season(String name) { this.name = name; }
}3. 枚举常用方法
values() 返回所有实例、valueOf("SPRING") 转字符串为枚举、ordinal() 序号。
枚举是单例的最佳实现(effective java 推荐),它是线程安全、防序列化破解的。
九、权限修饰符
| 修饰符 | 同类 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| 默认(包级) | √ | √ | × | × |
| private | √ | × | × | × |
十、设计模式初步
- 模板方法模式:抽象类定义算法骨架,子类填充细节。
- 接口的默认方法:JDK 8 后可作为接口的能力扩展。
练习建议
- 写 Animal → Cat/Dog 体系,练习多态调用。
- 用接口实现「USB 设备」模拟(鼠标、键盘)。
- 写一个模板方法:计算代码执行时间(abstract 方法做业务,父类记录前后
System.currentTimeMillis())。 - 用枚举实现一个"星期"类,根据星期输出工作日/休息日。