Java中的接口(interface)和抽象类(abstract class)是两种用于实现多态性和封装的机制,它们有以下区别:
1. 定义方式:接口使用interface关键字定义,抽象类使用abstract class关键字定义。
2. 实现方式:一个类可以实现多个接口,但只能继承一个抽象类。
3. 成员变量:接口中只能定义常量,而抽象类可以定义常量和非常量的成员变量。
4. 构造函数:接口不能有构造函数,而抽象类可以有构造函数。
5. 方法实现:接口中的方法都是抽象的,没有方法体,而抽象类可以包含抽象方法和具体方法的实现。
6. 默认方法:接口可以定义默认方法(default method),提供了在接口中添加新方法而不破坏已有实现类的兼容性的能力。抽象类不能定义默认方法。
7. 继承关系:接口之间可以通过extends关键字进行继承,一个接口可以继承多个接口。抽象类之间可以通过extends关键字进行继承,一个类只能继承一个抽象类。
8.接口和抽象类都不能使用final修饰符,接口和抽象类的设计目的是为了被继承和实现,因此不允许使用final修饰符。
9. 使用场景:接口适用于定义一组相关的操作,用于实现类的多态性。抽象类适用于定义一些通用的属性和方法,用于实现类的继承和共享代码。
1. 接口方法修饰符:
- 默认修饰符:接口中的方法默认为public abstract,可以被实现类实现。
- public:接口中的方法可以被实现类实现,并且在实现类中必须使用public修饰符进行重写。
- static:接口中的方法可以使用static修饰符定义静态方法,可以直接通过接口名调用。
- default:Java 8引入了默认方法,可以在接口中使用default修饰符定义具有默认实现的方法。实现类可以选择重写默认方法,也可以直接继承默认实现。
2. 抽象类方法修饰符:
- 默认修饰符:抽象类中的抽象方法默认为protected,可以被子类继承和实现。
- public:抽象类中的抽象方法可以被子类继承和实现,并且在子类中必须使用public修饰符进行重写。
- protected:抽象类中的抽象方法可以被子类继承和实现,并且在子类中可以使用protected修饰符进行重写。
- abstract:抽象类中的抽象方法必须使用abstract修饰符进行定义,没有方法体,需要在子类中进行实现。
- final:抽象类中的具体方法可以使用final修饰符进行定义,阻止子类对该方法的重写。
需要注意的是,接口中的方法默认为public abstract,而抽象类中的抽象方法默认为protected。此外,接口中的方法都是隐式抽象的,不需要使用abstract关键字进行修饰,而抽象类中的抽象方法必须使用abstract关键字进行修饰。