当前位置: 首页 > news >正文

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(); // 行为多态:执行老师跑步逻辑

多态实现的三个前提

  1. 存在继承/实现关系
  2. 存在父类引用指向子类对象
  3. 存在方法重写

重要提示: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 模板方法设计模式

解决问题:消除方法中的重复代码

实现步骤

  1. 定义抽象类
  2. 创建模板方法(包含相同代码)
  3. 定义抽象方法(放置可变代码)
  4. 子类实现抽象方法
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() {}
}

冲突解决原则

  1. 父类优先:父类方法与接口默认方法同名时使用父类方法
  2. 必须重写:多个接口同名默认方法需显式重写
  3. 不支持多继承:方法签名冲突时不支持接口多继承
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不可变类、不可重写方法、常量(宏替换)核心类保护、系统配置定义
抽象类抽象方法、模板方法模式、共性代码抽取框架设计、业务模板
接口多实现、默认方法、静态方法、面向接口编程功能扩展、系统插件化

设计哲学

  1. 多态是代码灵活性的基石
  2. 抽象类侧重于代码复用和模板设计
  3. 接口专注于行为契约和功能扩展
  4. final提供不变性和安全性保障

掌握这些面向对象高级特性,能够显著提升代码的灵活性、可扩展性和可维护性,是Java高级开发的必备技能。

相关文章:

  • 5.2 Qt Creator 使用FFmpeg库
  • 【09】设计并实现一套面向 Agent 任务规划的 DSL 语言
  • python:使用 OpenAI CLIP 模型进行图像与文本的语义匹配,并用彩虹色带可视化 CLIP 模型的相似度矩阵
  • TodoList 案例(Vue3): 使用Composition API
  • 嵌入式开发之嵌入式系统架构如何搭建?
  • 【StarRocks系列】建表优化
  • AI与SEO关键词协同进化
  • HarmonyOS 5 NPU支持哪些AI框架?
  • 系统化的Node.js服务器搭建攻略
  • 如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
  • 读者写者问题与读写锁自旋锁
  • 文献调研[eeg溯源的深度学习方法](过程记录)
  • AI大模型学习之基础数学:微积分在AI大模型中的核心-梯度与优化(梯度下降)详解
  • 《Effective Python》第九章 并发与并行——总结(基于物流订单处理系统)
  • Flink流水线+Gravitino+Paimon集成
  • Go实战项目OneX介绍(5/12):通过测试,了解 OneX 项目的使用方式和功能
  • 微前端MFE:(React 与 Angular)框架之间的通信方式
  • c++中 Lambda表达式
  • 57-Oracle SQL Profile(23ai)实操
  • 项目练习:Jaspersoft Studio制作PDF报表时,detail和column footer之间存在很大的空白区
  • 中小型网站建设与管理/推广普通话活动方案
  • 建筑网站大全豆丁网/百度提升排名
  • 网站域名改版怎么做/网站测试报告
  • 昆明做网站的/免费b2b网站有哪些
  • 武汉科技职业学院有哪些专业/seo教学培训
  • 网站中宣传彩页怎么做的/百度软件中心下载