1.1 什么是Java接口及其核心特性
Java接口像一份标准合同。它规定了类必须提供哪些功能,却不关心具体实现方式。想象你购买一台电视机——电源接口、HDMI接口都是固定规格,不同品牌电视都必须遵守这些规范。Java接口扮演着类似的角色。
接口的核心特性很鲜明。它只能包含抽象方法(Java 8前)、默认方法和静态方法。所有方法默认都是public abstract,变量默认是public static final。这种设计让接口天生适合定义行为规范。我记得第一次使用接口时,惊讶于它的简洁性——只告诉我需要做什么,把具体操作留给实现类。
接口支持多重继承,这是它与类最显著的区别之一。一个类可以实现多个接口,这种灵活性让Java在保持单继承优点的同时,获得了多继承的能力。
1.2 接口在面向对象编程中的重要性
接口在面向对象设计中承担着桥梁作用。它连接了抽象与具体,定义了系统间的通信协议。没有接口,Java的多态特性将大打折扣。
接口促进了代码的解耦。当两个模块通过接口交互时,它们不需要了解彼此的内部实现。这种松耦合设计让系统更易于维护和扩展。我参与过一个电商项目,正是通过统一的订单处理接口,顺利接入了支付宝、微信支付等不同支付渠道。
接口还支持测试驱动开发。你可以先定义接口,编写测试用例,再实现具体类。这种方式确保了代码质量,也提高了开发效率。
1.3 接口与类的区别与联系
接口和类都定义类型,但承担着不同职责。类描述对象是什么,接口描述对象能做什么。类关注实现细节,接口关注能力契约。
从语法层面看,类使用class关键字,接口使用interface。类可以实例化(非抽象类),接口不能直接创建对象。类可以有构造方法,接口完全没有。类的成员变量可以是任意类型,接口的变量只能是常量。
但接口和类又紧密相连。类通过implements关键字实现接口,必须提供接口中所有抽象方法的具体实现。接口可以继承其他接口,形成更专业的规范体系。
在实际开发中,我经常建议新手这样理解:类是你的员工,接口是岗位说明书。员工需要满足岗位要求,但可以用自己的方式完成工作。这种比喻帮助很多人理清了接口与类的关系。 public interface Drawable {
// 接口内容
}
public class Circle implements Drawable {
private double radius;
@Override
public void draw() {
System.out.println("绘制圆形,半径:" + radius);
}
}
// 不推荐的设计 - 职责过多 public interface UserService {
void register(User user);
void login(String username, String password);
void resetPassword(String email);
void updateProfile(User user);
void deleteAccount(long userId);
void sendNotification(Message message);
void generateReport(Date start, Date end);
}
// 过度设计的接口层次 public interface ProductQuery {
List<Product> findAll();
}
public interface ProductFilterQuery extends ProductQuery {
List<Product> findByCategory(String category);
List<Product> findByPriceRange(double min, double max);
}
public interface ProductSortQuery extends ProductFilterQuery {
List<Product> findAllSorted(SortOrder order);
}
public interface ProductPaginationQuery extends ProductSortQuery {
Page<Product> findPaginated(int page, int size);
}
public interface PaymentService {
/**
* 执行支付
* @param request 支付请求
* @return 支付结果
*/
PaymentResult pay(PaymentRequest request);
/**
* 查询支付状态
* @param orderId 订单ID
* @return 支付状态
*/
PaymentStatus queryStatus(String orderId);
/**
* 退款处理
* @param refundRequest 退款请求
* @return 退款结果
*/
RefundResult refund(RefundRequest refundRequest);
/**
* 判断是否支持该支付方式
* @param paymentType 支付类型
* @return 是否支持
*/
boolean supports(PaymentType paymentType);
}