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

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(常量)。

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("战士举盾防御");}
}

六、常见误区

  1. 滥用继承:如果不需要复用代码,优先用接口。
  2. 过度设计:不要为了用抽象类而用,根据需求选择。
  3. 忽略默认方法:Java 8+ 的接口可以通过 default 方法提供默认实现,减少代码重复。

七、总结

  • 抽象类是什么(is-a),适合代码复用 + 部分规范。
  • 接口能做什么(has-a),适合定义行为 + 多态扩展。

掌握两者的区别和适用场景,能帮助你写出更灵活、可维护的代码!如果还有疑问,可以尝试写几个小例子练习一下~ 😊


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

  • 数据中台建设系列(五):SQL2API驱动的数据共享与服务化实践
  • RAG优化知识库检索(1):基础概念与架构
  • 2025最新精选5款3DMAX建筑可视化插件
  • 【C/C++】为什么要noexcept
  • 不拆机查看电脑硬盘型号的常用方法
  • List<T>中每次取固定长度的数据
  • 数据结构与算法—顺序表和链表(1)
  • 互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现
  • N6715C 基础型定制配置直流电源分析仪
  • 升级 Azure Kubernetes 服务群集的关键注意事项
  • C#学习——继承、封装、多态
  • 软件工程之面向对象分析深度解析
  • 《软件项目经济性论证报告模板:全面解析与策略建议》
  • 排序算法-希尔排序
  • 移动IP与手机移动数据流量的概念、原理、区别与联系
  • 手写 vue 源码 === ref 实现
  • 开源数字人框架 AWESOME-DIGITAL-HUMAN 技术解析与应用指南
  • OpenHarmony平台驱动开发(十),MMC
  • 【优选算法】C++双指针问题
  • 基于扩展卡尔曼滤波(EKF)目标轨迹算法仿真实例
  • 人民日报刊文:守护“技术进步须服务于人性温暖”的文明底线
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 云南一餐馆收购长江野生鱼加工为菜品,被查处罚款
  • 美乌基金协议:美国搞了一套可在资源富集地区复刻的商业模式
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 中华人民共和国和俄罗斯联邦关于全球战略稳定的联合声明