| 特性 | 接口 | 抽象類 |
|---|---|---|
| 方法類型 | 默認 public abstract(Java 8+ 支持 default/static) | 可包含抽象與具體方法 |
| 變量 | 隱式 public static final | 可定義實例/靜態變量 |
| 構造器 | 無 | 可有(供子類調用) |
| 繼承關係 | implements,可多實現 | extends,單繼承 |
| 實例化 | 不可 | 不可 |
Comparable、Runnable、Driver(JDBC)AbstractList、HttpServlet、模板方法模式基類Car extends Vehicle → 抽象類Car implements Drivable → 接口Bird implements Flyable(企鵝不飛)→ 應拆分為 Flyable/Swimmable 等細粒度接口// 業務接口層
public interface UserService {
User findById(Long id);
void save(User user);
}
// 實現層依賴接口,而非具體類
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepo; // 依賴 Repository 接口
public User findById(Long id) { return userRepo.findById(id).orElse(null); }
public void save(User user) { userRepo.save(user); }
}
// Controller 僅依賴 Service 接口
@RestController
public class UserController {
private final UserService userService; // 構造器注入
public UserController(UserService userService) { this.userService = userService; }
}
Stream.of()Collection → AbstractCollection)❌ 「接口完全可以用抽象類替代」
✅ 抽象類無法解決多實現、跨繼承體系的多態需求
❌ 「所有方法都要定義在接口」
✅ 接口應保持精簡,遵循接口隔離原則
接口定義「規範」,抽象類提供「骨架」。優先使用接口定義服務契約,提取共性代碼時引入抽象類。這是面向對象設計中「面向接口編程」與「模板方法模式」的語言級體現。