Skip to content

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. 前提

  1. 继承 / 实现
  2. 方法重写
  3. 父类引用指向子类对象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 后可作为接口的能力扩展。

练习建议

  1. 写 Animal → Cat/Dog 体系,练习多态调用。
  2. 用接口实现「USB 设备」模拟(鼠标、键盘)。
  3. 写一个模板方法:计算代码执行时间(abstract 方法做业务,父类记录前后 System.currentTimeMillis())。
  4. 用枚举实现一个"星期"类,根据星期输出工作日/休息日。