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

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);}
}
http://www.xdnf.cn/news/4250.html

相关文章:

  • 【项目】基于ArkTS的网吧会员应用开发(1)
  • 访问计划(C++)
  • BC9 printf的返回值
  • 学习路线(工业自动化软件架构)
  • Imagine Explainers:AI × 可视化 × 趣味讲解,让复杂变简单
  • 1. 设计哲学与核心价值
  • C/C++滑动窗口算法深度解析与实战指南
  • 2025年第十六届蓝桥杯省赛JavaB组真题
  • 【RocketMQ Broker 相关源码】-注册 broker 信息到所有的 NameServer
  • gcc/g++用法摘记
  • torch.nn.Sequential() and torch.nn.ModuleList()
  • 用输入输出变量根据超稳定性理论设计模型参考自适应系统
  • 迭代器模式
  • map和set的设计以及红黑树的设计
  • 英伟达语音识别模型论文速读:Fast Conformer
  • 学习黑客Nmap 实战
  • Java学习手册:Spring 多数据源配置与管理
  • 信息系统项目管理工程师备考计算类真题讲解十二
  • 破局者手册 Ⅰ:测试开发核心基础,解锁未来测试密钥!
  • 【NLP】27. 语言模型训练以及模型选择:从预训练到下游任务
  • RAG知识库只是表面简单!
  • Kubernetes排错(七)-节点排错
  • 除了java.nio.file.StandardCopyOption,还有哪些类可以实现文件的复制和移动?
  • C++动态库和静态库的生成和使用
  • linux crash工具详解
  • android-ndk开发(1): 搭建环境
  • 星途-(4)
  • 关于Python:9. 深入理解Python运行机制
  • DeepSeek技术发展详细时间轴与技术核心解析
  • ARM子程序调用与返回