JavaSE核心知识点02面向对象编程02-03(抽象类与接口)
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- JavaSE核心知识点02面向对象编程02-03(抽象类与接口)
- 一、抽象类(Abstract Class)
- **1. 什么是抽象类?**
- **2. 抽象方法**
- **3. 继承抽象类**
- **4. 使用场景**
- 二、接口(Interface)
- **1. 什么是接口?**
- **2. 定义接口**
- **3. 实现接口**
- **4. 多实现**
- **5. 使用场景**
- 三、抽象类 vs 接口:核心区别
- 四、如何选择抽象类 vs 接口?
- **1. 用抽象类的情况**
- **2. 用接口的情况**
- 五、实际案例
- **场景**:设计一个游戏中的角色系统
- 六、常见误区
- 七、总结
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
JavaSE核心知识点02面向对象编程02-03(抽象类与接口)
好的!作为Java面向对象编程的两个核心概念,抽象类和接口是代码设计中非常重要的工具。下面我会从基础概念到实际应用,用简单易懂的方式为你详细讲解它们的区别和使用场景。
一、抽象类(Abstract Class)
1. 什么是抽象类?
- 定义:用
abstract
关键字修饰的类,不能被实例化(不能直接new
)。 - 核心作用:为子类提供公共模板,强制子类实现某些方法。
- 特点:
- 可以包含普通方法(有方法体)和抽象方法(无方法体)。
- 可以有成员变量、构造方法、静态方法等。
- 单继承:一个类只能继承一个抽象类。
2. 抽象方法
- 定义:用
abstract
修饰的方法,没有方法体,必须由子类实现。public abstract class Animal {// 抽象方法:没有方法体public abstract void eat();// 普通方法public void sleep() {System.out.println("动物在睡觉");} }
3. 继承抽象类
- 子类必须实现所有抽象方法,否则子类也必须声明为
abstract
。public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");} }
4. 使用场景
- 代码复用:多个子类有共同的代码逻辑(如
sleep()
方法)。 - 强制规范:要求子类必须实现某些功能(如
eat()
方法)。
二、接口(Interface)
1. 什么是接口?
- 定义:用
interface
关键字定义,表示一组行为规范。 - 核心作用:定义类能做什么(能力),而不是是什么(类型)。
- 特点:
- 默认方法:Java 8+ 允许接口包含
default
方法(有方法体)。 - 静态方法:Java 8+ 允许接口包含
static
方法。 - 多实现:一个类可以实现多个接口。
- 没有构造方法,不能实例化。
- 成员变量默认是
public static final
(常量)。
- 默认方法:Java 8+ 允许接口包含
2. 定义接口
public interface Flyable {// 抽象方法(默认是 public abstract)void fly();// Java 8+ 默认方法default void land() {System.out.println("正在着陆");}// Java 8+ 静态方法static void checkAltitude() {System.out.println("检查飞行高度");}
}
3. 实现接口
- 使用
implements
关键字,必须实现所有抽象方法。public class Bird implements Flyable {@Overridepublic void fly() {System.out.println("鸟在飞");} }
4. 多实现
- 一个类可以实现多个接口,解决Java单继承的局限性。
public class SuperDrone implements Flyable, Chargeable {// 实现所有接口的抽象方法 }
5. 使用场景
- 定义行为:比如
Flyable
(可飞)、Swimmable
(可游泳)。 - 解耦代码:通过接口隔离不同模块的依赖。
- 多态性:通过接口类型引用对象,提高灵活性。
三、抽象类 vs 接口:核心区别
特性 | 抽象类 | 接口 |
---|---|---|
继承/实现 | 单继承(extends) | 多实现(implements) |
方法 | 可以有抽象方法和具体方法 | Java 8前只有抽象方法,现在可以有默认方法和静态方法 |
成员变量 | 可以是普通变量 | 默认是 public static final (常量) |
构造方法 | 有构造方法 | 无构造方法 |
设计目的 | 表示“是什么”(is-a关系) | 表示“能做什么”(has-a能力) |
使用场景 | 代码复用 + 部分规范 | 完全规范 + 行为扩展 |
四、如何选择抽象类 vs 接口?
1. 用抽象类的情况
- 多个子类有共同的属性和方法需要复用。
- 需要定义非 public 的成员或非静态方法。
- 需要定义构造方法初始化状态。
2. 用接口的情况
- 需要定义一组行为规范(如不同设备的功能)。
- 需要实现多继承(一个类实现多个接口)。
- 希望解耦代码,提高扩展性。
五、实际案例
场景:设计一个游戏中的角色系统
- 抽象类:
Character
(角色),定义公共属性(如生命值、位置)和方法(如移动)。 - 接口:
Attackable
(可攻击)、Defendable
(可防御),定义不同角色的能力。
// 抽象类:角色基类
public abstract class Character {protected int health;protected int x, y;public Character(int health) {this.health = health;}public abstract void move(); // 抽象方法:移动方式由子类实现public void takeDamage(int damage) {health -= damage;}
}// 接口:可攻击
public interface Attackable {void attack(Character target);
}// 接口:可防御
public interface Defendable {void defend();
}// 具体类:战士
public class Warrior extends Character implements Attackable, Defendable {public Warrior() {super(100);}@Overridepublic void move() {System.out.println("战士步行移动");}@Overridepublic void attack(Character target) {System.out.println("战士用剑攻击");target.takeDamage(20);}@Overridepublic void defend() {System.out.println("战士举盾防御");}
}
六、常见误区
- 滥用继承:如果不需要复用代码,优先用接口。
- 过度设计:不要为了用抽象类而用,根据需求选择。
- 忽略默认方法:Java 8+ 的接口可以通过
default
方法提供默认实现,减少代码重复。
七、总结
- 抽象类:是什么(is-a),适合代码复用 + 部分规范。
- 接口:能做什么(has-a),适合定义行为 + 多态扩展。
掌握两者的区别和适用场景,能帮助你写出更灵活、可维护的代码!如果还有疑问,可以尝试写几个小例子练习一下~ 😊
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇