引言:现实世界中的"标准接口"
想象一下各种电子设备:
- 所有手机都用USB-C接口充电
- 所有家电都用220V插座供电
- 所有汽车都用汽油或电力作为能源
这些就是"标准接口"!在Java中,接口就像这些标准,它定义了一组行为规范,让不同的类可以遵循相同的"标准"。
一、什么是接口?
接口(Interface)是一种完全抽象的类,它只包含方法的声明,不包含方法的实现。可以把接口看作是:
- 契约/合同 → 规定类必须实现哪些方法
- 能力/角色 → 表示类具备什么能力
- 标准/规范 → 统一的操作方式
接口 vs 类:
| 特性 | 类 | 接口 |
|---|
| 方法 | 可以有具体实现 | 只有声明(Java 8前) |
| 字段 | 可以有各种字段 | 只能是常量 |
| 继承 | 只能继承一个类 | 可以实现多个接口 |
| 实例化 | 可以创建对象 | 不能创建对象 |
二、接口的基本使用
2.1 声明和实现接口
interface Animal {
void makeSound();
void eat();
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("狗狗汪汪叫!");
}
@Override
public void eat() {
System.out.println("狗狗吃骨头");
}
void fetch() {
System.out.println("狗狗捡球");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("猫咪喵喵叫!");
}
@Override
public void eat() {
System.out.println("猫咪吃鱼");
}
void climbTree() {
System.out.println("猫咪爬树");
}
}
public class BasicInterface {
public static void main(String[] args) {
System.out.println("=== 接口基本使用 ===");
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound();
dog.eat();
cat.makeSound();
cat.eat();
if (dog instanceof Dog) {
Dog realDog = (Dog) dog;
realDog.fetch();
}
System.out.println("\n=== 所有动物 ===");
Animal[] animals = {new Dog(), new Cat()};
for (Animal animal : animals) {
animal.makeSound();
animal.eat();
System.out.println();
}
}
}
2.2 接口中的常量
public class InterfaceConstants {
public static void main(String[] args) {
System.out.println("=== 接口中的常量 ===");
System.out.println("圆周率: " + MathConstants.PI);
System.out.println("自然常数: " + MathConstants.E);
System.out.println("重力加速度: " + PhysicsConstants.GRAVITY);
double radius = 5.0;
double area = MathConstants.PI * radius * radius;
System.out.println("半径为5的圆面积: " + area);
System.out.println("\n=== 配置信息 ===");
System.out.println("最大连接数: " + DatabaseConfig.MAX_CONNECTIONS);
System.out.println("默认端口: " + DatabaseConfig.DEFAULT_PORT);
System.out.println("连接超时: " + DatabaseConfig.TIMEOUT + "秒");
}
}
interface MathConstants {
double PI = 3.141592653589793;
double E = 2.718281828459045;
public static final double SQRT2 = 1.414213562373095;
}
interface PhysicsConstants {
double GRAVITY = 9.8;
double LIGHT_SPEED = 299792458;
double AVOGADRO = 6.022e23;
}
interface DatabaseConfig {
int MAX_CONNECTIONS = 100;
int DEFAULT_PORT = 3306;
int TIMEOUT = 30;
String DEFAULT_HOST = "localhost";
}
三、接口的高级特性
3.1 默认方法(Java 8+)
public class DefaultMethods {
public static void main(String[] args) {
System.out.println("=== 默认方法(Java 8+)===");
Vehicle car = new Car();
Vehicle bike = new Bike();
car.start();
car.honk();
car.stop();
System.out.println();
bike.start();
bike.honk();
bike.stop();
ElectronicDevice phone = new Smartphone();
phone.powerOn();
phone.connectToWifi();
phone.powerOff();
}
}
interface Vehicle {
void start();
void stop();
default void honk() {
System.out.println("按喇叭!");
}
default void turnOnLights() {
System.out.println("打开车灯");
}
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("汽车启动");
}
@Override
public void stop() {
System.out.println("汽车停止");
}
@Override
public void honk() {
System.out.println("汽车鸣笛:嘀嘀!");
}
}
class Bike implements Vehicle {
@Override
public void start() {
System.out.println("自行车开始骑行");
}
@Override
public void stop() {
System.out.println("自行车停车");
}
}
interface ElectronicDevice {
void powerOn();
void powerOff();
default void connectToWifi() {
System.out.println("设备连接到WiFi");
}
default void updateSoftware() {
System.out.println("检查软件更新...");
System.out.println("软件已是最新版本");
}
}
class Smartphone implements ElectronicDevice {
@Override
public void powerOn() {
System.out.println("手机开机");
}
@Override
public void powerOff() {
System.out.println("手机关机");
}
@Override
public void connectToWifi() {
System.out.println("手机扫描WiFi信号...");
System.out.println("连接到家庭WiFi");
}
}
class Laptop implements ElectronicDevice {
@Override
public void powerOn() {
System.out.println("笔记本电脑启动");
}
@Override
public void powerOff() {
System.out.println("笔记本电脑关机");
}
}
3.2 静态方法(Java 8+)
public class StaticMethods {
public static void main(String[] args) {
System.out.println("=== 静态方法(Java 8+)===");
MathOperations.showInfo();
double max = MathOperations.max(10, 20, 15);
double min = MathOperations.min(10, 20, 15);
System.out.println("最大值: " + max);
System.out.println("最小值: " + min);
System.out.println("平方根5: " + MathOperations.sqrt(5));
System.out.println("\n=== 字符串工具 ===");
System.out.println("反转abc: " + StringUtils.reverse("abc"));
System.out.println("大写ABC: " + StringUtils.toUpperCase("abc"));
System.out.println("'hello'是字母吗? " + StringUtils.isAlpha("hello"));
}
}
interface MathOperations {
static void showInfo() {
System.out.println("数学运算工具");
}
static double max(double a, double b, double c) {
return Math.max(Math.max(a, b), c);
}
static double min(double a, double b, double c) {
return Math.min(Math.min(a, b), c);
}
static double sqrt(double x) {
return Math.sqrt(x);
}
static double power(double base, double exponent) {
return Math.pow(base, exponent);
}
}
interface StringUtils {
static String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
static String toUpperCase(String str) {
return str.toUpperCase();
}
static String toLowerCase(String str) {
return str.toLowerCase();
}
static boolean isAlpha(String str) {
return str.matches("[a-zA-Z]+");
}
static boolean isNumeric(String str) {
return str.matches("\d+");
}
}
3.3 私有方法(Java 9+)
public class PrivateMethods {
public static void main(String[] args) {
System.out.println("=== 私有方法(Java 9+)===");
BankAccount account = new SavingsAccount();
account.deposit(1000);
account.withdraw(500);
account.withdraw(600);
System.out.println("\n=== 日志系统 ===");
Logger fileLogger = new FileLogger();
fileLogger.logInfo("程序启动");
fileLogger.logError("文件未找到");
fileLogger.logDebug("调试信息");
}
}
interface BankAccount {
void deposit(double amount);
void withdraw(double amount);
default void checkBalance() {
double balance = getBalance();
System.out.println("当前余额: " + balance);
}
private double getBalance() {
return Math.random() * 10000;
}
private static boolean isValidAmount(double amount) {
return amount > 0;
}
default void validateAmount(double amount) {
if (!isValidAmount(amount)) {
System.out.println("金额无效: " + amount);
}
}
}
class SavingsAccount implements BankAccount {
@Override
public void deposit(double amount) {
validateAmount(amount);
System.out.println("存款: " + amount);
checkBalance();
}
@Override
public void withdraw(double amount) {
validateAmount(amount);
System.out.println("取款: " + amount);
checkBalance();
}
}
interface Logger {
void logInfo(String message);
void logError(String message);
void logDebug(String message);
private String formatLog(String level, String message) {
return "[" + level + "] " + new java.util.Date() + " - " + message;
}
default void log(String level, String message) {
String formatted = formatLog(level, message);
writeToLog(formatted);
}
void writeToLog(String message);
}
class FileLogger implements Logger {
@Override
public void logInfo(String message) {
log("INFO", message);
}
@Override
public void logError(String message) {
log("ERROR", message);
}
@Override
public void logDebug(String message) {
log("DEBUG", message);
}
@Override
public void writeToLog(String message) {
System.out.println("写入文件: " + message);
}
}
四、接口的多重实现
public class MultipleInterfaces {
public static void main(String[] args) {
System.out.println("=== 多重接口实现 ===");
SmartDevice smartTV = new SmartTV();
SmartDevice smartphone = new Smartphone2();
System.out.println("=== 智能电视 ===");
smartTV.powerOn();
smartTV.connectToWifi();
smartTV.playVideo();
smartTV.adjustVolume(20);
smartTV.powerOff();
System.out.println("\n=== 智能手机 ===");
smartphone.powerOn();
smartphone.connectToWifi();
smartphone.playVideo();
smartphone.adjustVolume(15);
smartphone.makeCall("123456789");
smartphone.powerOff();
System.out.println("\n=== 可飞行的动物 ===");
Flyable bird = new Bird();
Flyable bat = new Bat();
bird.fly();
bird.land();
bat.fly();
bat.land();
System.out.println("\n=== 超级动物 ===");
SuperAnimal eagle = new Eagle();
eagle.fly();
eagle.swim();
eagle.run();
eagle.hunt();
}
}
interface ElectronicDevice2 {
void powerOn();
void powerOff();
default void connectToWifi() {
System.out.println("连接到WiFi网络");
}
}
interface MultimediaDevice {
void playVideo();
void playAudio();
default void adjustVolume(int level) {
System.out.println("调整音量到: " + level);
}
}
interface CommunicationDevice {
void makeCall(String number);
void sendMessage(String number, String message);
}
interface SmartDevice extends ElectronicDevice2, MultimediaDevice, CommunicationDevice {
void updateSoftware();
}
class SmartTV implements SmartDevice {
@Override
public void powerOn() {
System.out.println("智能电视开机");
}
@Override
public void powerOff() {
System.out.println("智能电视关机");
}
@Override
public void playVideo() {
System.out.println("电视播放视频");
}
@Override
public void playAudio() {
System.out.println("电视播放音频");
}
@Override
public void makeCall(String number) {
System.out.println("电视不支持打电话");
}
@Override
public void sendMessage(String number, String message) {
System.out.println("电视不支持发短信");
}
@Override
public void updateSoftware() {
System.out.println("电视软件更新");
}
}
class Smartphone2 implements SmartDevice {
@Override
public void powerOn() {
System.out.println("手机开机");
}
@Override
public void powerOff() {
System.out.println("手机关机");
}
@Override
public void playVideo() {
System.out.println("手机播放视频");
}
@Override
public void playAudio() {
System.out.println("手机播放音乐");
}
@Override
public void makeCall(String number) {
System.out.println("手机拨打电话: " + number);
}
@Override
public void sendMessage(String number, String message) {
System.out.println("手机发送短信到" + number + ": " + message);
}
@Override
public void updateSoftware() {
System.out.println("手机系统更新");
}
}
interface Flyable {
void fly();
default void land() {
System.out.println("降落");
}
}
interface Swimmable {
void swim();
}
interface Runnable {
void run();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("鸟儿在天空飞翔");
}
@Override
public void land() {
System.out.println("鸟儿停在树枝上");
}
}
class Bat implements Flyable {
@Override
public void fly() {
System.out.println("蝙蝠在夜间飞行");
}
}
class SuperAnimal implements Flyable, Swimmable, Runnable {
private String name;
public SuperAnimal() {
this.name = "超级动物";
}
@Override
public void fly() {
System.out.println(name + "在天空翱翔");
}
@Override
public void swim() {
System.out.println(name + "在水中游泳");
}
@Override
public void run() {
System.out.println(name + "在陆地奔跑");
}
public void hunt() {
System.out.println(name + "在捕猎");
}
}
class Eagle extends SuperAnimal {
public Eagle() {
}
}
五、接口继承接口
public class InterfaceInheritance {
public static void main(String[] args) {
System.out.println("=== 接口继承接口 ===");
AdvancedPrinter printer = new OfficePrinter();
printer.powerOn();
printer.print("测试文档");
printer.scan();
printer.fax("传真内容");
printer.copy();
printer.powerOff();
NetworkDevice router = new WiFiRouter();
router.connect();
router.disconnect();
router.getIPAddress();
Vehicle2 car = new ModernCar();
car.start();
car.drive();
car.playMusic();
car.navigateTo("北京");
car.stop();
}
}
interface Printer {
void powerOn();
void powerOff();
void print(String document);
}
interface Scanner extends Printer {
void scan();
}
interface FaxMachine extends Scanner {
void fax(String document);
}
interface Copier extends FaxMachine {
void copy();
}
interface AdvancedPrinter extends Copier {
void showStatus();
}
class OfficePrinter implements AdvancedPrinter {
@Override
public void powerOn() {
System.out.println("打印机开机");
}
@Override
public void powerOff() {
System.out.println("打印机关机");
}
@Override
public void print(String document) {
System.out.println("打印: " + document);
}
@Override
public void scan() {
System.out.println("扫描文档");
}
@Override
public void fax(String document) {
System.out.println("传真: " + document);
}
@Override
public void copy() {
System.out.println("复印文档");
}
@Override
public void showStatus() {
System.out.println("打印机状态: 正常");
}
}
interface NetworkDevice {
void connect();
void disconnect();
String getIPAddress();
}
interface WirelessDevice extends NetworkDevice {
void connectToWifi(String ssid, String password);
int getSignalStrength();
}
interface Router extends WirelessDevice {
void setSSID(String ssid);
void setPassword(String password);
void restart();
}
class WiFiRouter implements Router {
private String ssid = "MyWiFi";
private String password = "password123";
@Override
public void connect() {
System.out.println("路由器连接网络");
}
@Override
public void disconnect() {
System.out.println("路由器断开网络");
}
@Override
public String getIPAddress() {
return "192.168.1.1";
}
@Override
public void connectToWifi(String ssid, String password) {
System.out.println("连接到WiFi: " + ssid);
}
@Override
public int getSignalStrength() {
return 90;
}
@Override
public void setSSID(String ssid) {
this.ssid = ssid;
System.out.println("设置SSID为: " + ssid);
}
@Override
public void setPassword(String password) {
this.password = password;
System.out.println("设置密码");
}
@Override
public void restart() {
System.out.println("重启路由器");
}
}
interface BasicVehicle {
void start();
void stop();
}
interface Drivable extends BasicVehicle {
void drive();
void brake();
}
interface EntertainmentSystem {
void playMusic();
void playRadio();
}
interface NavigationSystem {
void navigateTo(String destination);
String getCurrentLocation();
}
interface ModernCar extends Drivable, EntertainmentSystem, NavigationSystem {
void enableAutopilot();
}
class ModernCarImpl implements ModernCar {
@Override
public void start() {
System.out.println("汽车启动");
}
@Override
public void stop() {
System.out.println("汽车停止");
}
@Override
public void drive() {
System.out.println("汽车行驶");
}
@Override
public void brake() {
System.out.println("刹车");
}
@Override
public void playMusic() {
System.out.println("播放音乐");
}
@Override
public void playRadio() {
System.out.println("播放广播");
}
@Override
public void navigateTo(String destination) {
System.out.println("导航到: " + destination);
}
@Override
public String getCurrentLocation() {
return "当前位置: 北京市朝阳区";
}
@Override
public void enableAutopilot() {
System.out.println("启用自动驾驶");
}
}
六、接口在实际项目中的应用
import java.util.ArrayList;
import java.util.List;
public class RealWorldInterface {
public static void main(String[] args) {
System.out.println("=== 真实世界接口应用 ===");
DataStorageService storageService = new DataStorageService();
Storage database = new DatabaseStorage();
Storage fileSystem = new FileSystemStorage();
Storage cloud = new CloudStorage();
storageService.storeData(database, "用户数据");
storageService.storeData(fileSystem, "日志文件");
storageService.storeData(cloud, "备份数据");
storageService.retrieveData(database, "用户数据");
storageService.retrieveData(cloud, "备份数据");
System.out.println("\n=== 测试所有存储方式 ===");
Storage[] storages = {database, fileSystem, cloud};
for (Storage storage : storages) {
storage.testConnection();
storage.showInfo();
System.out.println();
}
System.out.println("=== 支付处理系统 ===");
PaymentProcessor processor = new PaymentProcessor();
Payment alipay = new AlipayPayment();
Payment wechat = new WechatPayment();
Payment bank = new BankTransferPayment();
processor.processPayment(alipay, 100.0);
processor.processPayment(wechat, 200.0);
processor.processPayment(bank, 300.0);
Payment[] payments = {alipay, wechat, bank};
for (Payment payment : payments) {
if (payment.isValid()) {
System.out.println(payment.getName() + " 是有效的支付方式");
}
}
}
}
interface Storage {
void store(String data);
String retrieve(String key);
void delete(String key);
default void testConnection() {
System.out.println("测试存储连接...");
}
default void showInfo() {
System.out.println("存储系统信息");
}
static Storage getDefaultStorage() {
return new FileSystemStorage();
}
}
class DatabaseStorage implements Storage {
@Override
public void store(String data) {
System.out.println("将数据存储到数据库: " + data);
}
@Override
public String retrieve(String key) {
System.out.println("从数据库检索数据: " + key);
return "数据库数据";
}
@Override
public void delete(String key) {
System.out.println("从数据库删除数据: " + key);
}
@Override
public void showInfo() {
System.out.println("数据库存储系统");
System.out.println("类型: MySQL");
System.out.println("版本: 8.0");
}
}
class FileSystemStorage implements Storage {
@Override
public void store(String data) {
System.out.println("将数据存储到文件系统: " + data);
}
@Override
public String retrieve(String key) {
System.out.println("从文件系统检索文件: " + key);
return "文件数据";
}
@Override
public void delete(String key) {
System.out.println("从文件系统删除文件: " + key);
}
@Override
public void showInfo() {
System.out.println("文件系统存储");
System.out.println("类型: NTFS");
System.out.println("容量: 1TB");
}
}
class CloudStorage implements Storage {
@Override
public void store(String data) {
System.out.println("将数据上传到云存储: " + data);
}
@Override
public String retrieve(String key) {
System.out.println("从云存储下载数据: " + key);
return "云存储数据";
}
@Override
public void delete(String key) {
System.out.println("从云存储删除数据: " + key);
}
@Override
public void showInfo() {
System.out.println("云存储系统");
System.out.println("提供商: AWS S3");
System.out.println("区域: us-east-1");
}
@Override
public void testConnection() {
System.out.println("测试云存储连接...");
System.out.println("连接成功!延迟: 50ms");
}
}
class DataStorageService {
public void storeData(Storage storage, String data) {
System.out.println("\n=== 存储数据 ===");
storage.store(data);
System.out.println("=== 存储完成 ===");
}
public void retrieveData(Storage storage, String key) {
System.out.println("\n=== 检索数据 ===");
String data = storage.retrieve(key);
System.out.println("获取到数据: " + data);
System.out.println("=== 检索完成 ===");
}
}
interface Payment {
boolean process(double amount);
String getName();
boolean isValid();
default void refund(double amount) {
System.out.println("退款: " + amount + "元");
}
}
class AlipayPayment implements Payment {
@Override
public boolean process(double amount) {
System.out.println("支付宝支付: " + amount + "元");
System.out.println("跳转到支付宝页面...");
System.out.println("支付成功!");
return true;
}
@Override
public String getName() {
return "支付宝";
}
@Override
public boolean isValid() {
return true;
}
@Override
public void refund(double amount) {
System.out.println("支付宝退款: " + amount + "元");
System.out.println("退款将在3个工作日内到账");
}
}
class WechatPayment implements Payment {
@Override
public boolean process(double amount) {
System.out.println("微信支付: " + amount + "元");
System.out.println("跳转到微信支付...");
System.out.println("支付成功!");
return true;
}
@Override
public String getName() {
return "微信支付";
}
@Override
public boolean isValid() {
return true;
}
}
class BankTransferPayment implements Payment {
@Override
public boolean process(double amount) {
System.out.println("银行转账: " + amount + "元");
System.out.println("请使用网银或手机银行完成转账");
System.out.println("转账成功!");
return true;
}
@Override
public String getName() {
return "银行转账";
}
@Override
public boolean isValid() {
return true;
}
}
class PaymentProcessor {
public void processPayment(Payment payment, double amount) {
System.out.println("\n=== 开始支付 ===");
boolean success = payment.process(amount);
if (success) {
System.out.println("支付处理完成");
} else {
System.out.println("支付失败");
}
System.out.println("=== 支付结束 ===");
}
}
七、总结
7.1 接口的核心概念
- 契约性:规定类必须实现的方法
- 抽象性:只声明方法,不提供实现(Java 8前)
- 多实现:一个类可以实现多个接口
- 解耦合:分离定义和实现
7.2 接口的发展历程
| Java版本 | 接口新特性 |
|---|
| Java 7及之前 | 只有抽象方法和常量 |
| Java 8 | 默认方法、静态方法 |
| Java 9 | 私有方法、私有静态方法 |
7.3 什么时候使用接口?
- 定义行为规范 → 需要多个类遵循相同的规范
- 实现多重继承 → 一个类需要多种能力
- 解耦合 → 分离接口和实现
- 定义回调 → 事件处理、监听器
- 策略模式 → 多种算法或策略
7.4 接口 vs 抽象类
| 特性 | 接口 | 抽象类 |
|---|
| 方法实现 | 可以有默认实现 | 可以有具体实现 |
| 字段 | 只能是常量 | 可以有各种字段 |
| 构造方法 | 不能有 | 可以有 |
| 多继承 | 支持多实现 | 只能单继承 |
| 设计目的 | 定义行为契约 | 提供部分实现 |
7.5 快速记忆口诀
- 接口定义行为,类来实现行为
- 一个类多接口,弥补单继承
- 默认方法防破坏,静态方法工具类
- 私有方法内共享,代码复用接口内