Java接口和抽象类是面向对象编程中实现抽象的两种机制,它们在语法、设计目的和使用场景上有显著区别:
一、核心区别
定义方式
- 抽象类:使用
abstract class
声明,可包含抽象方法和具体方法45。 - 接口:使用
interface
声明,方法默认是public abstract
(Java 8+支持默认方法和静态方法)45。
- 抽象类:使用
方法实现
- 抽象类:可提供方法的具体实现,子类可选择重写或继承13。
- 接口:方法默认无实现(Java 8前),实现类必须提供所有抽象方法的实现47。
成员变量
- 抽象类:可包含普通成员变量和静态变量512。
- 接口:只能包含
public static final
常量412。
构造方法
- 抽象类:可以有构造方法(用于子类初始化)310。
- 接口:不能有构造方法57。
继承与实现
- 抽象类:单继承(一个类只能继承一个抽象类)45。
- 接口:多实现(一个类可实现多个接口)47。
二、示例对比
1. 抽象类示例
public abstract class Animal {private String name; // 普通成员变量 public Animal(String name) { // 构造方法 this.name = name;}public abstract void makeSound();// 抽象方法public void sleep() {// 具体方法System.out.println(name + "正在睡觉");}}public class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void makeSound() {System.out.println("汪汪!");}}
2. 接口示例
public interface Drawable {String COLOR = "black"; // 常量(默认public static final)void draw(); // 抽象方法default void resize() { // 默认方法(Java 8+)System.out.println("调整大小");}
}public class Circle implements Drawable {@Overridepublic void draw() {System.out.println("绘制圆形,颜色:" + COLOR);}
}
三、应用场景
- 抽象类:适合定义模板或基类,封装子类共有的状态和行为(如
Animal
的name
属性和sleep
方法)13。 - 接口:适合定义行为契约(如
Runnable
的run()
),实现多态和解耦47。
关键设计原则:
- 需要共享代码或状态时用抽象类310。
- 需要定义多组不相关行为时用接口57。
Java 8对接口进行了重大增强,主要引入了以下新特性:
一、默认方法(Default Methods)
- 定义:使用
default
关键字修饰的实例方法,提供默认实现24 - 特点:
- 实现类可直接继承或重写默认方法
- 通过
接口名.super.方法名()
调用父接口的默认实现4
- 示例:
interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);} }
二、静态方法(Static Methods)
- 定义:使用
static
关键字修饰的方法,属于接口本身14 - 特点:
- 只能通过接口名调用(如
接口名.方法名()
) - 不会被实现类继承1
- 只能通过接口名调用(如
- 示例:
interface DataProcessor {static void printInfo() {System.out.println("DataProcessor v1.0");} }
三、函数式接口(Functional Interface)
- 定义:仅包含一个抽象方法的接口(可含多个默认/静态方法)13
- 标注:使用
@FunctionalInterface
注解强化语义3 - 内置类型:
Predicate<T>
:条件判断(test(T t)
)Function<T,R>
:数据转换(apply(T t)
)Consumer<T>
:数据消费(accept(T t)
)3
四、方法冲突解决规则
当实现多个接口且存在同名默认方法时,必须显式重写该方法4:
public class C implements A, B {@Overridepublic void execute() {A.super.execute(); // 显式选择接口A的实现}
}
这些特性使接口既能保持行为契约的定义能力,又能提供部分实现逻辑,显著提升了代码复用性和扩展性