第一部分:接口基础概念

接口是Java中实现抽象的重要机制,从Java 8开始引入了默认方法等新特性

学习目标

  • 理解接口与抽象类的区别
  • 掌握接口的基本语法
  • 了解Java 8接口新特性

什么是接口

接口(interface)是Java中的一种引用类型,是方法声明的集合。从Java 8开始,接口可以包含:

  • 抽象方法(abstract methods)
  • 默认方法(default methods)
  • 静态方法(static methods)
  • 私有方法(private methods)
  • 常量(public static final)

接口 vs 抽象类

接口(Interface)

  • 支持多继承
  • 变量默认public static final
  • 方法默认public abstract
  • 不能有构造方法
  • Java 8+支持默认方法

抽象类(Abstract Class)

  • 单继承限制
  • 可以有实例变量
  • 可以有非抽象方法
  • 可以有构造方法
  • 可以有main方法

第二部分:接口定义与实现

学习如何正确声明接口以及实现接口的步骤

1

基本接口定义

// 定义一个动物接口 public interface Animal { // 接口中的变量默认是 public static final int MAX_AGE = 100; // 抽象方法(默认 public abstract) void eat(); void sleep(); // Java 8 默认方法 default void move() { System.out.println("动物在移动"); } }
2

实现接口

public class Dog implements Animal { @Override public void eat() { System.out.println("狗在啃骨头"); } @Override public void sleep() { System.out.println("狗在睡觉,呼噜..."); } // 可以选择重写默认方法 @Override public void move() { System.out.println("狗在奔跑"); } }
3

测试接口实现

public class InterfaceTest { public static void main(String[] args) { Animal myDog = new Dog(); // 调用接口方法 myDog.eat(); // 输出: 狗在啃骨头 myDog.sleep(); // 输出: 狗在睡觉,呼噜... myDog.move(); // 输出: 狗在奔跑 // 访问接口常量 System.out.println("最大寿命: " + Animal.MAX_AGE); } }

第三部分:默认方法详解

Java 8引入的默认方法允许接口提供方法实现

学习目标

  • 理解默认方法的语法
  • 掌握默认方法的使用场景
  • 解决默认方法冲突
1

默认方法语法

public interface Vehicle { // 抽象方法 void start(); // 默认方法提供默认实现 default void print() { System.out.println("我是一辆交通工具"); } // 默认方法可以调用其他方法 default void honk() { System.out.println("嘟嘟!"); } }
2

默认方法冲突解决

interface A { default void hello() { System.out.println("来自A的问候"); } } interface B { default void hello() { System.out.println("来自B的问候"); } } class C implements A, B { @Override public void hello() { // 必须解决冲突,选择一种实现 A.super.hello(); // 调用A的默认方法 // B.super.hello(); // 或调用B的默认方法 } }

默认方法使用场景

  • 接口演化:向现有接口添加新方法而不破坏实现类
  • 可选方法:为接口方法提供默认实现
  • 行为组合:通过多个接口组合复杂行为

第四部分:静态方法与私有方法

Java 8引入静态方法,Java 9引入私有方法

1

接口中的静态方法

public interface Calculator { // 静态方法 static int add(int a, int b) { return a + b; } static double power(double base, int exponent) { return Math.pow(base, exponent); } // 抽象方法 int calculate(int x, int y); } // 使用静态方法 int result = Calculator.add(5, 3);
2

Java 9私有方法

public interface DataProcessor { default void process() { validateData(); // 调用私有方法 transformData(); saveData(); } // 私有实例方法(Java 9+) private void validateData() { System.out.println("验证数据..."); } // 私有静态方法(Java 9+) private static void transformData() { System.out.println("转换数据..."); } private void saveData() { System.out.println("保存数据..."); } }

第五部分:函数式接口

只有一个抽象方法的接口,是Lambda表达式的基础

1

@FunctionalInterface注解

@FunctionalInterface public interface StringProcessor { // 唯一的抽象方法 String process(String input); // 默认方法不影响函数式接口 default String trimAndUpperCase(String input) { return input.trim().toUpperCase(); } } // 使用Lambda表达式实现 StringProcessor processor = str -> str.toLowerCase(); String result = processor.process("HELLO"); // "hello"
2

常用函数式接口

接口 方法 用途 示例
Predicate<T> boolean test(T t) 条件判断 x -> x > 0
Function<T,R> R apply(T t) 类型转换 s -> s.length()
Consumer<T> void accept(T t) 消费数据 x -> System.out.println(x)
Supplier<T> T get() 提供数据 () -> Math.random()

第六部分:常见错误与最佳实践

避免接口使用中的常见陷阱

常见错误1:接口变量命名

错误示例:

interface Config { int maxSize = 100; // 错误:应该全大写 }

正确做法:

interface Config { int MAX_SIZE = 100; // 接口常量全大写 }

常见错误2:实现类访问权限

错误示例:

interface Readable { void read(); } class MyClass implements Readable { private void read() { // 错误:不能缩小访问权限 ... } }

最佳实践

  • 接口名使用形容词或名词(如Runnable, Serializable)
  • 常量名使用全大写,单词间用下划线
  • 默认方法要有明确的文档说明
  • 函数式接口使用@FunctionalInterface注解
  • 避免过度使用默认方法

第七部分:实战练习

通过实际项目巩固接口知识

练习1:支付系统接口设计

步骤1:定义支付接口

public interface PaymentProcessor { boolean processPayment(double amount); default void refund(double amount) { System.out.println("退款 " + amount + " 元"); } static String getCurrency() { return "CNY"; } }

步骤2:实现具体支付方式

public class AlipayProcessor implements PaymentProcessor { @Override public boolean processPayment(double amount) { System.out.println("使用支付宝支付 " + amount + " 元"); return true; } } public class WechatProcessor implements PaymentProcessor { @Override public boolean processPayment(double amount) { System.out.println("使用微信支付 " + amount + " 元"); return true; } }

步骤3:测试支付系统

public class PaymentTest { public static void main(String[] args) { PaymentProcessor alipay = new AlipayProcessor(); PaymentProcessor wechat = new WechatProcessor(); alipay.processPayment(100.0); wechat.processPayment(200.0); // 使用默认方法 alipay.refund(50.0); // 使用静态方法 System.out.println("货币: " + PaymentProcessor.getCurrency()); } }

学习检查清单

  • ✅ 理解接口的基本概念
  • ✅ 掌握接口定义语法
  • ✅ 学会实现接口
  • ✅ 理解默认方法的使用
  • ✅ 掌握静态和私有方法
  • ✅ 完成支付系统练习
  • ✅ 避免常见错误