Java中抽象类和接口的区别
Java中抽象类与接口的区别
抽象类
什么是抽象类?
在继承时,许多的子类方法才会比较具体,但我们在父类中只能给出比较通用的定义,比如说计算面积,对于不同的派生类会有不同的实现方法,比如三角形和矩形的面积计算公式就是不一样的,子类派生出后才能使得类的方法变得具体,这时含有没有具体定义的方法的父类就是抽象类(abstract class)。当一个父类是抽象类时,它没有具体的实例。
定义格式
在class前加上abstract关键字,就定义了一个抽象类
/*例如*/ public abstract class Base {}
抽象类中的方法成员
- 抽象类的构造方法应该定义为protected,因为其不应该被实例化对象且构造方法需要被子类调用
- 抽象类的方法可以是抽象方法也可以是普通方法
- 如果一个类有抽象方法,那必须定义为抽象类
- 抽象方法必须定义为protected或public,默认是public
抽象类的属性成员
抽象类中的属性和普通类没有区别,但他只能被子类调用
注意事项
1. 子类继承抽象类时如果想要把子类实例化,那就必须把抽象类中的抽象方法全部重写,否则必须在子类前加abstract,使他成为抽象类
2. 抽象类不能被实例化,不能作为对象的实际类型
3. 但是抽象类可以作为对象的声明类型来实现多态
public abstract class Shaped{
protected Shaped(){}
public abstract double getArea();
}
class Circle extends Shaped{
@Override
double getArea() {
return 34;
}
}
上面我们简单的定义了一个抽象类和他的子类
我们不能实例化一个抽象类,但我们可以用他来进行多态的实现(可以把它作为声明类型,但不能把它作为实际类型)
Shaped shape = new Circle();
System.out.println("The area of the circle is " + shape.getArea());
还可以利用数组一样的方式创建一连串的引用类型变量
Shaped[] s = new Shaped[10];
for (int i = 0; i < 10; i++) {
s[i] = new Circle();
}
需要注意的是抽象类只能被普通类和抽象类继承
接口
什么是接口?
接口在许多方面与抽象类相似,但是接口的目的是指明相关与不相关类的多个对象的共同行为,也就是说,是指明功能,而不是类。
定义格式
public interface 接口名 {}
接口方法
方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字不可以,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。
接口属性
接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)
implements
格式:class Son implements Father
多继承
接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题。
默认方法
JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰,定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法。
静态方法
JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用。
格式:接口名.静态方法名
抽象类和接口比较
相同点
-
都不能被实例化
-
抽象方法都必须被子类重写才能实例化
不同点
参数 | 抽象类 | 接口 |
---|---|---|
默认构造函数 | 有默认构造方法 | 不存在构造方法 |
定义 | class abstract | interface |
继承 | extends,由抽象类和普通类继承,只能单继承 | 能被接口和普通类继承,可以多继承,也可以被抽象类实现 |
添加新方法 | 只需要在抽象类中添加方法 | 必须将全部子方法重写 |
应用场景
-
抽象类
如果你拥有一些方法并且想让它们中的一些有默认实现,那么可以使用抽象类
如果基本功能在不断改变,那么就需要使用抽象类
-
接口
如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
如果方法不需要一直改变,你可以使用接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~