定义
接口,在java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
值得注意的是:
-
接口不是类;
-
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法;
-
接口无法被实例化,但是可以被实现;一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
应用场景
1.多态性
通过接口,多个类可以实现相同的接口,从而在运行时根据具体类型调用相应的方法。
// 定义一个支付接口
public interface PaymentService {
void pay(double amount);
}
// 实现信用卡支付
public class CreditCardPaymentService implements PaymentService {
@Override
public void pay(double amount) {
// 信用卡支付逻辑
System.out.println("Paid " + amount + " using Credit Card.");
}
}
// 实现支付宝支付
public class AlipayPaymentService implements PaymentService {
@Override
public void pay(double amount) {
// 支付宝支付逻辑
System.out.println("Paid " + amount + " using Alipay.");
}
}
2.解耦合
通过接口将接口的定义和具体实现分开,使得高层模块不依赖于低层模块的具体实现。比如,在业务逻辑层中依赖于数据访问接口,而不直接依赖于具体的数据访问实现类。
接口和抽象类区别
1.在定义和目的上
-
接口
-
主要用于定义一组方法(行为)的锲约,所有实现这个接口的类都必须实现这些方法;
-
接口没有任何实现,通常只包含方法签名(即方法的名称、参数和返回类型)
-
-
抽象类
-
是一个不能被实例化的类,通常用于共享代码和状态。
-
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
-
2.实现
-
接口:
-
一个类可以实现多个接口,从而支持多重继承。
-
接口的实现必须实现所有定义的方法,除非该类是一个抽象类。
-
-
抽象类:
-
一个类只能继承一个抽象类,这限制了多重继承,但可以继承抽象类中的具体实现。
-
子类可以选择实现或重写抽象类中的抽象方法,也可以继承具体方法的实现。
-
3. 字段(属性)
-
接口:
-
不能包含实例变量,通常只能包含静态常量(
public static final
)和方法签名。
-
-
抽象类:
-
可以包含实例变量、构造函数和任何访问修饰符(如
private
,protected
,public
)的属性。
-
特性 | 接口 (Interface) | 抽象类 (Abstract Class) |
---|---|---|
定义 | 只包含方法声明,不能包含具体实现(Java 8 之后可以有默认方法和静态方法)。 | 可以包含方法声明和具体实现。 |
多继承 | 一个类可以实现多个接口,支持多重继承。 | 一个类只能继承一个抽象类,不支持多重继承。 |
构造函数 | 不可以有构造函数。 | 可以有构造函数,用于初始化属性。 |
字段 | 只能包含常量(public static final)和方法(默认是public)。 | 可以包含实例变量和常量,访问修饰符可以是public、protected或private。 |
使用场景 | 用于表示某种能力或行为,强调功能的实现。 | 用于表示一个类的共性,提供基本的实现和状态。 |
适用性 | 适用于不相关类之间的功能共享。 | 适用于有相似特征和行为的类之间的共享。 |
实现方式 | 通过implements 关键字实现。 | 通过extends 关键字继承。 |
灵活性 | 更灵活,因为可以通过实现多个接口来组合功能。 | 不如接口灵活,因为只允许单继承。 |
-
接口主要用于定义能力或行为的规范,可以被多个不相关的类实现,适用于需要多重继承的场景。
-
抽象类则用于表示类的共性和状态,可以包含具体实现,适合有共同特征的类。