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

抽象类与接口的区别

抽象类和接口时 Java中实现抽象逻辑的两种重要机制,它们都用于定义规范并隐藏具体实现,但在设计目的和使用场景上有显著区别。

详细解析:


1.关键字不同

2.定义与继承/实现方式

(1)抽象类:

  用abstract class定义,子类通过extends继承,且Java中类只能单继承(一个子类最多继承一个抽象类)。

abstract class Animal { // 抽象类public abstract void eat(); // 抽象方法(无实现)public void breathe() { // 具体方法(有实现)System.out.println("呼吸");}
}class Dog extends Animal { // 单继承@Overridepublic void eat() {System.out.println("狗吃骨头");}
}

(2)接口:

用interface定义,类通过implements实现,一个类可以同时实现多个接口(多实现)。

interface Flyable { // 接口void fly(); // 抽象方法(默认public abstract)
}interface Runnable {void run();
}class Bird implements Flyable, Runnable { // 多实现@Overridepublic void fly() {System.out.println("鸟飞");}@Overridepublic void run() {System.out.println("鸟跑");}
}

3.方法与字段的差异

(1)抽象类:

  • 可以混合抽象方法(abstract 修饰,无实现)和具体方法(有方法体)。
  • 字段可以是任意访问修饰符(private/protected/public),可以是变量(可修改)或常量。
abstract class Car {protected String brand; // 普通字段(可修改)private static final int WHEEL_COUNT = 4; // 常量public abstract void drive(); // 抽象方法public void honk() { // 具体方法System.out.println("鸣笛");}
}

(2)接口:

  • Java 8 前:只能有抽象方法(默认 public abstract,无需显式声明)。
  • Java 8 后:可添加 default 方法(有实现,供实现类直接使用或重写)和 static 方法(接口的静态工具方法)。
  • 字段默认是 public static final(必须初始化,且不能修改)。
interface Chargeable {int MAX_POWER = 100; // 等价于 public static final int MAX_POWER = 100void charge(); // 抽象方法(默认public abstract)default void showPower() { // 默认方法(有实现)System.out.println("当前功率:" + MAX_POWER);}static void safetyTips() { // 静态方法System.out.println("充电安全提示");}
}

4.构造方法与实例化

(1)抽象类

  有构造方法(用于子类初始化时调用),但不能直接实例化(需通过子类实例化)

abstract class Shape {public Shape() { // 构造方法System.out.println("创建形状");}
}class Circle extends Shape {public Circle() {super(); // 调用父类构造方法}
}// 错误:不能实例化抽象类
// Shape shape = new Shape(); 

(2)接口:无构造方法,绝对不能实例化(接口时规范,不是具体实现)

4.设计目的与使用场景

(1)抽象类:核心是代码复用。

   例如:Animal 是抽象类,DogCat 是其子类(狗和猫 “是” 动物),抽象类中可包含所有动物的  共性方法(如 breathe()),子类只需实现自己特有的方法(如 eat())。

(2)接口:核心是定义规范。

 例如:Flyable 接口定义 “飞” 的规范,Bird(鸟)、Plane(飞机)都可以实现 Flyable—— 它们不是同一类事物,但都 “能飞”。

http://www.dtcms.com/a/337138.html

相关文章:

  • 【C语言篇】操作符详解
  • Ubuntu下无法在huggingface下载指定模型的解决方法
  • Read Frog:一款开源AI浏览器语言学习扩展
  • 如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true
  • Java原子类详解
  • 并发编程原理与实战(二十四)Java并发基石LockSupport park/unpark机制全解析
  • 车e估牵头正式启动乘用车金融价值评估师编制
  • AI出题人给出的Java后端面经(十八)(日更)
  • Java基础八股复习3 jvm-内存结构
  • 数据仓库理论
  • 具身智能2硬件架构(人形机器人)摘自Openloong社区
  • Vue3 中使用 Element Plus 完整指南
  • 博客项目 Spring + Redis + Mysql
  • 利用DeepSeek辅助WPS电子表格ET格式分析
  • 代码随想录算法训练营四十五天|图论part03
  • flask——4:请求与响应
  • 机器学习(决策树)
  • pytest的前置与后置
  • 决策树:机器学习中的直观分类与回归工具
  • CPTS---Active 复现
  • Python netifaces 库详解:跨平台网络接口与 IP 地址管理
  • Alma Linux 8 中解决掉 Failed to set locale, defaulting to C.UTF-8
  • vue3入门-v-model、ref和reactive讲解
  • Flink Stream API - 源码开发需求描述
  • Apache IoTDB集群部署实战:1C2D架构的高性能时序数据库搭建与优化指南
  • Claude Code 代理商汇总:2025年最新评测
  • 【Vivado TCL教程】从零开始掌握Xilinx Vivado TCL脚本编程(一)
  • 【Jenkins】03 - 自动构建和docker构建
  • 在 CentOS 7 上使用 LAMP 架构部署 WordPress
  • 制作全流程对比:侗家灰水粽VS布依族草灰粽的8道工序差异