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

Android/Java 中接口(Interface)的使用场景、用途和方法

一、接口(Interface)的用途和核心思想

接口的核心思想是:定义一套行为规范或契约。它只规定“应该做什么”(方法声明),但不关心“具体怎么做”(方法实现)。

其主要用途可以概括为:

  1. 实现多态(Polymorphism): 这是接口最重要的用途。一个类可以实现多个接口,从而可以被当做不同的类型来使用,极大地增加了代码的灵活性。
  2. 实现完全抽象: 在 Java 8 之前,接口是所有方法都是抽象且未实现的纯粹抽象类。它强制实现类提供所有方法的具体实现,确保了规范的执行。
  3. 降低耦合(Decoupling): 代码依赖于接口(抽象),而不是具体的实现类。这使得你可以轻松替换不同的实现,而不影响其他部分的代码。这是软件设计原则(如依赖倒置原则)的核心。
  4. 定义回调机制(Callback): 正如监听器(Listener)所示,接口是实现回调的完美工具。你提供一个接口,别人(系统或其他类)会在特定时机调用你实现的方法。

二、关键特性和语法演变(Java 7 → Java 8+)

接口的特性随着 Java 版本在不断演进,这在 Android 开发中(取决于你设置的 compileSdkVersiontargetSdkVersion)同样适用。

Java 7 及以前(传统接口)
  • 抽象方法(Abstract Methods): 接口中的方法默认是 public abstract 的,不能有方法体。实现类必须重写所有这些方法。

    public interface Animal {void eat();   // 默认就是 public abstract void eat();void sleep(); // 默认就是 public abstract void sleep();
    }
    
  • 常量(Constants): 接口中定义的变量默认是 public static final 的(即常量)。

    public interface Constants {int MAX_SPEED = 100; // 默认就是 public static final int MAX_SPEED = 100;
    }
    
Java 8 及以后(现代接口)

为了增强接口的灵活性,Java 8 引入了两个重要的新特性:

  • 默认方法(Default Methods): 使用 default 关键字修饰的方法。它可以有方法体。

    • 用途: 当需要为接口添加新方法时,为了避免破坏所有已有的实现类,可以提供一個默认实现。这样已有的实现类无需做任何修改。
    public interface Vehicle {void start(); // 传统抽象方法// Java 8 默认方法default void honk() {System.out.println("Beep beep!");}
    }
    // 实现类可以选择不重写 honk(),直接使用默认实现
    public class Car implements Vehicle {@Overridepublic void start() {System.out.println("Car starts with key.");}// 没有重写 honk(),使用 Vehicle 接口的默认实现
    }
    
  • 静态方法(Static Methods): 使用 static 关键字修饰的方法。它属于接口本身,而不是实现类的实例。通过接口名直接调用。

    • 用途: 提供与接口相关的工具方法,这些方法不需要依赖对象实例。
    public interface MathOperations {static int add(int a, int b) {return a + b;}
    }
    // 调用方式:MathOperations.add(5, 3); // 输出 8
    

三、主要使用场景

1. 定义回调机制 / 监听器模式 (Most Common in Android)

这是 Android 开发中最常见的接口用法。

// 1. 定义回调接口
public interface OnDownloadCompleteListener {void onComplete(String filePath);void onError(Exception e);
}// 2. 在一个服务类中持有接口引用并提供设置方法
public class DownloadManager {private OnDownloadCompleteListener mListener;public void setOnDownloadCompleteListener(OnDownloadCompleteListener listener) {this.mListener = listener;}public void startDownload(String url) {// 模拟下载过程...new Thread(() -> {try {// ... 下载逻辑// 3. 在完成后回调if (mListener != null) {mListener.onComplete("/sdcard/downloaded_file.zip");}} catch (Exception e) {if (mListener != null) {mListener.onError(e);}}}).start();}
}// 4. 在Activity中实现接口并设置监听器
public class MainActivity extends AppCompatActivity implements OnDownloadCompleteListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);DownloadManager manager = new DownloadManager();manager.setOnDownloadCompleteListener(this); // 设置监听器manager.startDownload("http://example.com/file.zip");}// 5. 实现回调方法@Overridepublic void onComplete(String filePath) {runOnUiThread(() -> Toast.makeText(this, "Downloaded: " + filePath, Toast.LENGTH_SHORT).show());}@Overridepublic void onError(Exception e) {runOnUiThread(() -> Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show());}
}
2. 实现多态和策略模式

根据不同情况使用不同的算法或策略。

// 定义策略接口
public interface PaymentStrategy {void pay(double amount);
}// 实现不同的策略
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid " + amount + " using Credit Card.");}
}public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid " + amount + " using PayPal.");}
}// 使用策略的上下文类
public class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy strategy) {this.paymentStrategy = strategy;}public void checkout(double amount) {paymentStrategy.pay(amount);}
}// 使用
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment()); // 可以轻松替换策略
cart.checkout(100.0);
3. 依赖抽象,而非具体实现(降低耦合)

这是优秀架构设计的关键。

// 接口(抽象)
public interface UserRepository {User getUserById(int id);void saveUser(User user);
}// 具体实现1:数据库存储
public class DatabaseUserRepository implements UserRepository {@Overridepublic User getUserById(int id) { /* SQLite 查询逻辑 */ }@Overridepublic void saveUser(User user) { /* SQLite 插入逻辑 */ }
}// 具体实现2:网络API存储
public class ApiUserRepository implements UserRepository {@Overridepublic User getUserById(int id) { /* 网络请求逻辑 */ }@Overridepublic void saveUser(User user) { /* 网络请求逻辑 */ }
}// 业务逻辑类,它只依赖接口,不关心具体实现
public class UserManager {private final UserRepository repository; // 依赖接口// 通过构造函数注入依赖(Dependency Injection)public UserManager(UserRepository repo) {this.repository = repo;}public void updateUserProfile(User user) {// 业务逻辑...repository.saveUser(user); // 调用接口方法,不关心是存到数据库还是网络}
}
// 这样,测试时你可以传入一个 Mock 实现,非常方便。

四、接口 vs. 抽象类

这是一个经典面试题。它们很相似,但有关键区别:

特性接口 (Interface)抽象类 (Abstract Class)
方法实现Java 8 前不能有,之后可以有默认/静态方法可以有抽象方法,也可以有具体实现的方法
成员变量只能是常量 (public static final)可以是普通变量、常量、静态变量
构造方法没有构造方法构造方法(虽然不能实例化,但子类可以调用)
继承一个类可以实现多个接口一个类只能继承一个抽象类
设计目的“has-a” 关系,定义行为契约、能力“is-a” 关系,定义是什么,提供模板
访问修饰符方法默认 public方法可以有 public, protected, private

如何选择?

  • 如果你主要关心的是定义一组行为能力,并且不相关的类可能需要共享这些行为,使用接口。(例如:Comparable(可比较), Serializable(可序列化))。
  • 如果你要定义一些紧密相关的对象的基本模板,并且其中包含一些公共的实现代码,使用抽象类。(例如:Animal 作为 Dog, Cat 的基类)。

总结

接口是 Java/Android 实现抽象多态低耦合代码的最强大工具之一。

  1. 用途: 定义契约、实现多态、解耦代码、实现回调。
  2. 核心方法抽象方法(必须实现)、默认方法(可选实现)、静态方法(接口工具方法)。
  3. 主要场景
    • Android 监听器/回调 (最常见)
    • 策略模式等设计模式
    • 依赖注入和架构设计(如 Repository 模式)
  4. 关键优势一个类可以实现多个接口,提供了比继承更灵活的代码复用方式。

文章转载自:

http://WKWAFXdN.xjbtb.cn
http://LCJ1qt58.xjbtb.cn
http://gn9btzym.xjbtb.cn
http://Vxkq8GGm.xjbtb.cn
http://Ux8TVXiW.xjbtb.cn
http://Hq6Y5a3a.xjbtb.cn
http://isq98Gq7.xjbtb.cn
http://MMY8Pm33.xjbtb.cn
http://kzieOM6A.xjbtb.cn
http://62Je28p5.xjbtb.cn
http://ke2fa6FA.xjbtb.cn
http://eNCSDKEl.xjbtb.cn
http://MGGdjjH9.xjbtb.cn
http://2m5Gpd9a.xjbtb.cn
http://rqEXFa34.xjbtb.cn
http://LBieljms.xjbtb.cn
http://PexTUEhb.xjbtb.cn
http://ojlQFZII.xjbtb.cn
http://VYobvSaG.xjbtb.cn
http://LMoosbC0.xjbtb.cn
http://UPRjaCFV.xjbtb.cn
http://lPNL6CD3.xjbtb.cn
http://DnQTsKlI.xjbtb.cn
http://FLWi32LS.xjbtb.cn
http://LZ5ARQVb.xjbtb.cn
http://mQA1GudK.xjbtb.cn
http://AyBQJMgz.xjbtb.cn
http://J68r7akb.xjbtb.cn
http://36msy7Ia.xjbtb.cn
http://MvL9BdKj.xjbtb.cn
http://www.dtcms.com/a/367931.html

相关文章:

  • android 读取cpu+m1类型的nfc卡片,设置只读写m1的内容
  • 扫描件、PDF、图片都能比对!让文档差异无所遁形
  • 【FastDDS】Discovery ( 05-Discovery Server Settings)
  • 嵌入式第四十六天(51单片机(通信))
  • 通过Gen AI SDK调用gemini 2.5 pro,单独上传pdf文件 | ai agent 开发笔记 2025.9.2 Day 2
  • Linux服务器暴走,用Netdata+cpolar轻松驯化
  • Node.js 做 Web 后端优势为什么这么大?
  • Windows 文件资源管理器无法预览文件内容word、ppt、excel、pdf
  • android 四大组件—BroadcastReceiver
  • 聊一聊 .NET 中的 CancellationTokenSource
  • Ubuntu 22 redis集群搭建
  • 开发环境 之 编辑器、编译器、IDE梳理
  • adobe acrobat 安装到使用再到PDF编辑【适合小白,只看一篇就够!!!】
  • [VF2] Boot Ubuntu和Debian发行版
  • 模型剪枝----ResNet18剪枝实战
  • CSS Position 属性
  • 【Android】制造一个ANR并进行简单分析
  • 《sklearn机器学习——回归指标1》
  • 使用tomcat本地部署draw.io
  • C++《C++11》(上)
  • XR数字融合工作站打造智能制造专业学习新范式
  • windows通过xrdp远程连接Ubuntu黑屏问题解决
  • 第25节:VR基础与WebXR API入门
  • Vue-25-利用Vue3大模型对话框设计之前端和后端的基础实现
  • 沪深300股指期权包含上证50期权吗?
  • webhook使用
  • AMD KFD驱动技术分析16:SVM Aperture
  • linux Nginx服务配置介绍,和配置流程
  • 数字人源头厂商实力全揭秘,系统搭建能力盘点!
  • LangChain: Models, Prompts 模型和提示词