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

Java抽象类与接口详解

一、抽象类(Abstract Class)

1. 定义与基本使用

// 抽象类定义
public abstract class Animal {// 抽象方法(无实现)public abstract void makeSound();// 具体方法(有实现)public void sleep() {System.out.println("动物在睡觉");}
}// 继承抽象类
class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}

2. 抽象类特点

  • abstract关键字修饰
  • 可以包含抽象方法和具体方法
  • 不能直接实例化
  • 子类必须实现所有抽象方法(除非子类也是抽象类)

3. 适用场景

  • 多个相关类共享代码和行为的场景
  • 需要定义非静态或非final字段时
  • 需要定义构造方法时
  • 需要控制子类访问权限时

二、接口(Interface)

1. 定义与基本使用

// 接口定义(Java 8+)
public interface Vehicle {// 抽象方法(默认public abstract)void start();// 默认方法(Java 8+)default void stop() {System.out.println("车辆停止");}// 静态方法(Java 8+)static void honk() {System.out.println("按喇叭!");}
}// 实现接口
class Car implements Vehicle {@Overridepublic void start() {System.out.println("汽车启动");}
}

2. 接口特点

  • 所有方法默认public abstract(Java 8前)
  • 可以包含default方法和static方法(Java 8+)
  • 可以定义常量(默认public static final
  • 支持多实现(一个类可实现多个接口)

3. 适用场景

  • 定义行为契约/规范
  • 需要多继承行为的场景
  • 定义回调机制(如事件监听)
  • 作为API的契约定义

三、抽象类与接口对比

特性抽象类接口
关键字abstract classinterface
方法可含抽象方法和具体方法Java 8前只能有抽象方法,之后可含默认/静态方法
变量可含任意类型变量只能含public static final常量
构造器
继承单继承多实现
访问修饰符可任意默认public
设计目的代码复用定义契约
实例化不能不能(但可用匿名类或Lambda)

四、如何选择

使用抽象类当:

  1. 多个相关类需要共享代码
  2. 需要定义非final的字段
  3. 需要定义非public的成员
  4. 需要定义构造方法

使用接口当:

  1. 需要定义行为规范
  2. 需要多继承行为
  3. 需要定义API契约
  4. 需要支持Lambda表达式

五、Java 8+的新变化

  1. 接口的默认方法

    interface Flyable {default void fly() {System.out.println("默认飞行方式");}
    }
    
  2. 接口的静态方法

    interface MathUtils {static int add(int a, int b) {return a + b;}
    }
    
  3. 私有方法(Java 9+):

    interface Logger {private void log(String message) {System.out.println(message);}default void info(String msg) {log("INFO: " + msg);}
    }
    

六、设计建议

  1. 优先使用接口:更灵活,更容易扩展
  2. 接口定义行为,抽象类实现部分行为
  3. 组合优于继承:考虑使用接口+组合代替复杂的类继承
  4. 接口隔离原则:将大接口拆分为多个小接口

七、典型应用示例

1. 抽象类应用:模板方法模式

abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {initialize();startPlay();endPlay();}
}class Cricket extends Game {// 实现各个步骤...
}

2. 接口应用:策略模式

interface PaymentStrategy {void pay(int amount);
}class CreditCardPayment implements PaymentStrategy {public void pay(int amount) {System.out.println("信用卡支付: " + amount);}
}class ShoppingCart {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void checkout(int amount) {strategy.pay(amount);}
}

相关文章:

  • 关于string类的构造函数
  • 基于 jQuery 实现灵活可配置的输入框验证功能
  • 效整理文件信息!一键生成文件夹目录的工具
  • 简单理解MCP:AI如何使用工具
  • 开元类双端互动组件部署实战全流程教程(第1部分:环境与搭建)
  • 网络:cookie和session
  • 使用汇率查询API帮你实时查询汇率,促进货币交流
  • GPU性能加速的隐藏魔法:Dual-Issue Warp Schedule全解析
  • 游戏开发的TypeScript(5)TypeScript的类型转换
  • ciscn_2019_c_1
  • 2025 年 408 真题及答案
  • wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
  • 数据集-目标检测系列- 牙刷 检测数据集 toothbrush >> DataBall
  • Cadence高速系统设计流程及工具使用
  • WidowX-250s 机械臂的简单数字孪生案例
  • 2025.5.4总结
  • 【信息系统项目管理师-论文真题】2007下半年论文详解(包括解题思路和写作要点)
  • 【信息系统项目管理师-论文真题】2008上半年论文详解(包括解题思路和写作要点)
  • TS 交叉类型
  • linux stm32mp157 GIC-V2 中断处理过程分析
  • 《中国医药指南》就涉宫颈癌等论文出现男性病例致歉:辞退涉事编辑
  • 泰国培训十万网络安全人员加强网络防御打击电诈
  • 沙发上躺赢又如何?告别冠军绝缘体的凯恩,要开始收割荣誉了
  • 我给狗狗上课,月赚四五万
  • 黎巴嫩9年来首次举行地方选举
  • 普京称俄中关系对维护世界稳定具有战略意义