第一部分:接口基础概念
接口是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());
}
}
学习检查清单
- ✅ 理解接口的基本概念
- ✅ 掌握接口定义语法
- ✅ 学会实现接口
- ✅ 理解默认方法的使用
- ✅ 掌握静态和私有方法
- ✅ 完成支付系统练习
- ✅ 避免常见错误