【面向对象】抽象类与接口(定义、区别、适用场景)

【面向对象】抽象类与接口(定义、区别、适用场景)
考点频率★★★★★选择题必考下午题设计类图时也经常涉及难度⭐⭐⭐建议重点理解“抽象类是is-a是什么接口是can-do能做什么”的区别1️⃣ 先想一个问题为什么有了类还不够前面我们讲了封装、继承、多态有了这三个特性好像面向对象已经挺完整了。但实际开发中会遇到一个尴尬的问题假设你设计了一个动物类里面有一个叫()方法。但不同动物的叫声完全不同——狗是“汪汪”猫是“喵喵”牛是“哞哞”。动物类里的叫()方法根本写不出一个“通用”的实现——因为每种动物的叫声都不同。你能想到两种写法在动物类里写一个空方法子类去覆盖它。在动物类里抛出一个异常“这个方法必须在子类中实现”这两种方式都“能用”但都不够“正规”。面向对象需要一种机制明确告诉调用者“这个类只是一个概念不能直接实例化里面的某些方法没有实现必须由子类来提供。”这就是抽象类和接口存在的意义——把“是什么”类型和“能做什么”能力拆分开来。2️⃣ 抽象类Abstract Class2.1 定义抽象类是用abstract关键字修饰的类它不能被实例化不能new只能被继承。抽象类可以包含已实现的方法具体方法未实现的方法抽象方法只有声明没有方法体必须由子类实现成员变量、构造器子类可以通过super调用2.2 一句话理解抽象类 一个不完整的模板。它帮你写好了公共的部分但留了几个“空位”让子类去填。2.3 典型场景多个子类有共同的属性和方法复用代码但某些方法无法在父类中统一实现必须由子类各自实现你希望禁止别人直接创建父类的对象2.4 示例抽象类 动物 { 属性: 年龄, 体重 方法: 吃() { 输出(吃东西) } // 已实现子类可以直接用 抽象方法: 叫() // 未实现子类必须自己写 } class 狗 extends 动物 { 叫() { 输出(汪汪) } // 必须实现抽象方法 } class 猫 extends 动物 { 叫() { 输出(喵喵) } // 必须实现抽象方法 }你永远不能写new 动物()但你可以写动物 a new 狗()。3️⃣ 接口Interface3.1 定义接口是用interface关键字定义的类型它不能包含任何实现传统定义Java 8 以后可以有默认方法但软考仍以传统定义为主所有方法都是抽象的。接口只定义了“能做什么”但不规定“怎么做”。3.2 一句话理解接口 一份“能力清单”/“合同”。它只列出“能做哪些事”但不关心谁来做、怎么做。3.3 典型场景完全不相关的类但需要具备同样的行为如鸟和飞机都能飞提供多继承能力——一个类可以实现多个接口作为系统的“边界”或“契约”——模块之间通过接口通信3.4 示例接口 可飞行 { 飞() } class 鸟 extends 动物 implements 可飞行 { 飞() { 输出(扇翅膀飞) } } class 飞机 implements 可飞行 { 飞() { 输出(喷气推进) } }鸟和飞机没有继承关系但都“能飞”。接口让它们可以统一处理。4️⃣ 抽象类 vs 接口核心区别必考对比项抽象类Abstract Class接口Interface关键字abstract classinterface实例化❌ 不能实例化❌ 不能实例化方法实现可以有具体方法已实现所有方法都是抽象的无实现成员变量可以有各种类型的变量只能有public static final常量构造器可以有构造器❌ 不能有构造器继承/实现单继承一个类只能继承一个抽象类多实现一个类可以实现多个接口关系语义is-a“是一种”can-do“能做什么”使用场景多个类有公共代码需要复用不相关的类有共同行为需要统一契约5️⃣ 如何选择一张图说清楚┌─────────────────────────────────────┐ │ 你需要“复用代码”吗 │ └─────────────────────────────────────┘ │ ┌─────────────┴─────────────┐ │ 是 │ 否 ▼ ▼ ┌───────────────┐ ┌───────────────┐ │ 用 抽象类 │ │ 用 接口 │ │ 把公共代码 │ │ 只定义“能力” │ │ 放到父类中 │ │ 不定义实现 │ └───────────────┘ └───────────────┘6️⃣ 经典例题例题1以下关于抽象类和接口的叙述中正确的是 。A. 抽象类可以被实例化B. 接口中可以包含已实现的方法C. 一个类只能实现一个接口D. 抽象类可以包含构造器解析A错误——抽象类不能实例化B错误——接口中所有方法都是抽象的传统定义C错误——一个类可以实现多个接口D正确——抽象类可以有构造器供子类调用。选D。例题2某系统需要设计“飞行”行为鸟和飞机都需要具备飞行能力但它们之间没有继承关系。以下哪种设计最合适A. 创建一个飞行抽象类让鸟和飞机都继承它B. 创建一个可飞行接口让鸟和飞机都实现它C. 在鸟和飞机中各自独立实现飞行方法D. 创建一个飞行工具类包含所有飞行逻辑解析鸟和飞机没有继承关系不是“is-a”但都需要飞行能力“can-do”。用接口最合适——解耦、灵活、可扩展。选B。7️⃣ 记忆口诀抽象类 是啥is-a公共代码往下放。接口 能干啥can-do只定契约不实现。抽象单继承接口多实现选择靠场景。8️⃣ 小测验评论区对答案以下关于抽象类和接口的说法中错误的是 。A. 抽象类可以包含具体方法和抽象方法B. 接口中的方法默认是 public abstractC. 一个类可以同时继承一个抽象类并实现多个接口D. 抽象类中的成员变量默认为 public static final本专栏日更点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #抽象类 #接口 #面向对象 #软考备考