个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
【Java】接口和抽象类有什么共同点和区别?
比较:接口和抽象类
🚀共同点
共同点
:
- 抽象性: 接口和抽象类都是用于表示抽象类型,不能被实例化,需要子类来实现或继承 。
- 包含抽象方法: 接口和抽象类都可以包含抽象方法 ,这些方法在子类中需要被具体实现。
- 支持多态: 通过接口或抽象类,可以实现多态性 ,即通过统一的接口或抽象类类型引用不同的实现类对象。
- 都可以有默认实现的方法: Java 8 可以用
default
关键字在接口中定义默认方法
在 Java 8 及以后的版本中,引入了默认方法(Default Methods) 的概念,允许在接口中使用 default
关键字为接口方法提供默认的实现。这样可以在不破坏现有代码的基础上向接口中添加新的方法,而不需要修改所有实现该接口的类。同样,抽象类也可以拥有具有默认实现的方法。
下面是一个简单的例子,演示了在接口和抽象类中使用 default
关键字声明默认实现的方法:
在这个例子中,
MyInterface
接口和MyAbstractClass
抽象类都定义了一个抽象方法
abstractMethod
和一个默认方法defaultMethod
。然后,
MyClass
类实现了这个接口并继承了抽象类,实现了抽象方法,并且可以选择是否重写默认方法。在
main
方法中,创建了MyClass
的实例,并调用了抽象方法和默认方法,展示了默认方法的使用。
java
// 接口
interface MyInterface {
// 抽象方法
void abstractMethod();
// 默认方法
default void defaultMethod() {
System.out.println("This is a default implementation of MyInterface.");
}
}
// 抽象类
abstract class MyAbstractClass {
// 抽象方法
abstract void abstractMethod();
// 默认方法
default void defaultMethod() {
System.out.println("This is a default implementation of MyAbstractClass.");
}
}
// 具体类实现接口和继承抽象类
class MyClass extends MyAbstractClass implements MyInterface {
// 实现抽象方法
@Override
void abstractMethod() {
System.out.println("This is the implementation of abstractMethod in MyClass.");
}
// MyClass 可以选择重写默认方法
@Override
public void defaultMethod() {
System.out.println("This is a overridden default implementation in MyClass.");
}
}
public class DefaultMethodExample {
public static void main(String[] args) {
// 创建 MyClass 实例
MyClass myClass = new MyClass();
// 调用抽象方法和默认方法
myClass.abstractMethod();
myClass.defaultMethod();
}
}
🚀区别
区别
:
- 能否多继承: 一个类可以实现多个接口,但只能继承一个抽象类。
- 成员变量: 接口的成员变量只能是
public static final
修饰的常量,不能被修改且必须有初始值;抽象类可以包含实例变量,成员变量默认 default,可在子类中被重新定义,也可被重新赋值。 - 构造方法: 接口不能有构造方法;抽象类可以有构造方法,子类实例化时会调用父类的构造方法。
- 用途: 接口主要用于对类的行为进行约束(即定义规范),支持多继承,你实现了某个接口就具有了对应的行为,强调一种能力;抽象类主要用于建立类的层次结构以实现代码复用,强调的是所属关系。