day11——Java面向对象高级:多态、抽象类与接口深度解析
文章目录
- 一、多态:灵活性的艺术
- 1.1 多态的本质与实现
- 1.2 多态的优势与挑战
- 1.3 类型转换的注意事项
- 二、final关键字:不变的承诺
- 2.1 final的三种用法
- 2.2 final修饰变量的细节
- 2.3 常量:系统配置的最佳实践
- 三、抽象类:设计的蓝图
- 3.1 抽象类的定义与特点
- 3.2 抽象类的应用场景
- 3.3 模板方法设计模式
- 四、接口:功能的契约
- 4.1 接口的定义与实现
- 4.2 接口的优势
- 4.3 接口的演进:JDK8+新特性
- 4.4 接口的高级特性
- 五、综合应用:学生管理系统
- 5.1 接口定义
- 5.2 方案实现
- 5.3 系统集成
- 总结:面向对象特性对比
一、多态:灵活性的艺术
1.1 多态的本质与实现
多态是在继承/实现情况下的一种现象,表现为:
- 对象多态:同一父类引用可指向不同子类对象
- 行为多态:同一方法调用产生不同行为
People p1 = new Student(); // 对象多态:p1本质代表学生对象
People p2 = new Teacher(); // 对象多态:p2本质代表老师对象p1.run(); // 行为多态:执行学生跑步逻辑
p2.run(); // 行为多态:执行老师跑步逻辑
多态实现的三个前提:
- 存在继承/实现关系
- 存在父类引用指向子类对象
- 存在方法重写
重要提示:Java中的属性(成员变量)不谈多态
1.2 多态的优势与挑战
多态的核心优势:
// 参数使用父类类型,可接收任何子类对象
public static void go(People p) {p.run(); // 行为多态
}
- 解耦合:右侧对象可灵活替换
- 扩展性强:新增子类不影响现有代码
多态下的挑战:
People p = new Teacher();
p.teach(); // 编译错误!无法调用子类特有方法
解决方案:类型转换
// 自动类型转换(向上转型)
People people = new Teacher();// 强制类型转换(向下转型)
if (people instanceof Teacher) {Teacher teacher = (Teacher) people;teacher.teach(); // 成功调用特有方法
}
1.3 类型转换的注意事项
强制类型转换的风险:
People p = new Teacher();
Student s = (Student) p; // 运行时错误:ClassCastException
安全实践:
// 强转前使用instanceof检查
if (p instanceof Student) {Student s = (Student) p;s.study();
}
关键记忆点:原本是什么类型,才能还原成什么类型
二、final关键字:不变的承诺
2.1 final的三种用法
修饰目标 | 效果 | 代码示例 |
---|---|---|
类 | 不能被继承 | final class ImmutableClass |
方法 | 不能被重写 | public final void lock() |
变量 | 只能赋值一次 | final int MAX = 100; |
2.2 final修饰变量的细节
不同数据类型的表现:
// 基本类型:值不能变
final int age = 30;
// age = 31; // 编译错误!// 引用类型:地址不能变,对象内容可变
final int[] arr = {1, 2, 3};
arr[0] = 10; // 允许修改内容
// arr = new int[5]; // 编译错误!不能改变引用
2.3 常量:系统配置的最佳实践
常量的定义与优势:
public class Constant {// 命名规范:全大写+下划线分隔public static final String SCHOOL_NAME = "传智教育";public static final int MAX_STUDENTS = 1000;
}
常量的底层原理:
// 编译前
System.out.println(Constant.SCHOOL_NAME);// 编译后(宏替换)
System.out.println("传智教育");
设计建议:使用常量记录系统配置信息,提高代码可读性和可维护性
三、抽象类:设计的蓝图
3.1 抽象类的定义与特点
抽象类的核心特征:
public abstract class Animal {// 抽象方法:只有声明,没有实现public abstract void cry();// 普通方法public void sleep() {System.out.println("动物睡觉");}
}
抽象类的注意事项:
- 抽象类中不一定有抽象方法
- 有抽象方法的类必须是抽象类
- 抽象类不能创建对象
- 子类必须重写所有抽象方法(除非子类也是抽象类)
3.2 抽象类的应用场景
场景1:抽取共性代码
public abstract class Animal {private String name; // 公共属性// 公共方法public String getName() { return name; }// 抽象方法:子类实现具体行为public abstract void cry();
}
场景2:定义系统框架
// 支付处理抽象类
public abstract class PaymentProcessor {// 模板方法(final防止重写)public final void process() {validate();executePayment();sendReceipt();}// 抽象方法:具体支付方式实现protected abstract void executePayment();
}
3.3 模板方法设计模式
解决问题:消除方法中的重复代码
实现步骤:
- 定义抽象类
- 创建模板方法(包含相同代码)
- 定义抽象方法(放置可变代码)
- 子类实现抽象方法
public abstract class ReportGenerator {// 模板方法(final修饰)public final void generate() {prepareData(); // 相同代码formatReport(); // 抽象方法output(); // 相同代码}protected abstract void formatReport();
}class PDFGenerator extends ReportGenerator {@Overrideprotected void formatReport() {System.out.println("生成PDF格式报告");}
}
设计关键:模板方法使用final修饰,防止子类破坏模板结构
四、接口:功能的契约
4.1 接口的定义与实现
接口的核心特点:
public interface Swimmable {void swim(); // 默认public abstract
}public interface Flyable {void fly();
}class Duck implements Swimmable, Flyable {@Override public void swim() { /* 实现 */ }@Override public void fly() { /* 实现 */ }
}
接口的注意事项:
- 接口不能创建对象
- 类可实现多个接口
- 实现类必须重写所有抽象方法
4.2 接口的优势
优势1:弥补单继承不足
class Student {// 学生基本属性
}interface Programmer {void coding();
}interface Designer {void design();
}// 学生同时具备程序员和设计师能力
class SuperStudent extends Student implements Programmer, Designer {@Override public void coding() { /* 写代码 */ }@Override public void design() { /* 做设计 */ }
}
优势2:面向接口编程
// 数据存储接口
public interface DataStorage {void save(String data);String load();
}// 使用接口类型接收不同实现
DataStorage storage = new FileStorage();
storage.save("数据"); // 文件存储storage = new CloudStorage();
storage.save("数据"); // 云存储
4.3 接口的演进:JDK8+新特性
接口中的三种新方法:
public interface SmartDevice {// 1. 默认方法(实例方法)default void start() {System.out.println("设备启动中...");log("启动日志");}// 2. 私有方法(JDK9+)private void log(String message) {System.out.println("["+LocalTime.now()+"] "+message);}// 3. 静态方法static void checkStatus() {System.out.println("系统状态正常");}// 抽象方法void connect();
}
使用场景:
SmartDevice device = new SmartWatch();
device.start(); // 调用默认方法
device.connect(); // 调用抽象方法
SmartDevice.checkStatus(); // 调用静态方法
4.4 接口的高级特性
接口多继承:
interface A { void a(); }
interface B { void b(); }interface C extends A, B { // 接口多继承void c();
}class D implements C {@Override public void a() {}@Override public void b() {}@Override public void c() {}
}
冲突解决原则:
- 父类优先:父类方法与接口默认方法同名时使用父类方法
- 必须重写:多个接口同名默认方法需显式重写
- 不支持多继承:方法签名冲突时不支持接口多继承
class Conflict implements InterfaceA, InterfaceB {// 必须重写冲突方法@Overridepublic void conflictMethod() {InterfaceA.super.conflictMethod(); // 选择其中一个实现}
}
五、综合应用:学生管理系统
5.1 接口定义
public interface StudentOperator {void printAllInfo(List<Student> students);void printAverageScore(List<Student> students);
}
5.2 方案实现
方案一:基础实现
public class BasicOperator implements StudentOperator {@Overridepublic void printAllInfo(List<Student> students) {System.out.println("---- 学生列表 ----");for (Student s : students) {System.out.println(s.getName() + "\t" + s.getScore());}}
}
方案二:高级统计
public class AdvancedOperator implements StudentOperator {@Overridepublic void printAverageScore(List<Student> students) {double max = students.get(0).getScore();double min = students.get(0).getScore();double sum = 0;for (Student s : students) {double score = s.getScore();if (score > max) max = score;if (score < min) min = score;sum += score;}// 去掉最高分和最低分double avg = (sum - max - min) / (students.size() - 2);System.out.println("平均分: " + avg);}
}
5.3 系统集成
public class StudentSystem {private List<Student> students = new ArrayList<>();private StudentOperator operator;// 可灵活切换实现方案public StudentSystem(StudentOperator operator) {this.operator = operator;// 初始化数据...}public void generateReport() {operator.printAllInfo(students);operator.printAverageScore(students);}// 动态切换操作实现public void switchOperator(StudentOperator newOperator) {this.operator = newOperator;}
}
总结:面向对象特性对比
特性 | 关键要点 | 应用场景 |
---|---|---|
多态 | 对象多态、行为多态、类型转换、instanceof | 统一接口处理不同对象 |
final | 不可变类、不可重写方法、常量(宏替换) | 核心类保护、系统配置定义 |
抽象类 | 抽象方法、模板方法模式、共性代码抽取 | 框架设计、业务模板 |
接口 | 多实现、默认方法、静态方法、面向接口编程 | 功能扩展、系统插件化 |
设计哲学:
- 多态是代码灵活性的基石
- 抽象类侧重于代码复用和模板设计
- 接口专注于行为契约和功能扩展
- final提供不变性和安全性保障
掌握这些面向对象高级特性,能够显著提升代码的灵活性、可扩展性和可维护性,是Java高级开发的必备技能。