Java接口和抽象类的比较
Java接口和抽象类的比较
首先分别介绍一些两者的概念。
1、抽象类
用关键字abstract声明的类称为为abstract类(抽象类),例如:
abstract class A{
...
{
用关键字abstract声明的方法称为为abstract方法(抽象方法),例如:
abstract int min(int x,int y);
对于abstract只允许声明,不允许实现(没有方法体),而且不允许使用final和abstract同时修饰一个方法或类,也不允许使用satic修饰abstract方法,即abstract方法必须是实例方法。
1、abstract类中可以有抽象方法,也可以有非抽象方法;
2、abstract类不能使用new运算符创建该类的对象,如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不允许使用final修饰抽象类或抽象方法的原因。(用final修饰的类不能被继承,用final修饰的方法不能被子类重写)
3、如果一个非abstract类是abstract的子类,它必须重写父类的abstract方法,即去掉abstract方法的abstract修饰,并给出方法体。如果一个abstract类是abstract的子类,它可以重写父类的抽象方法,也可以继承父类的抽象方法,即可以不重写。
4、可以使用abstract类声明对象,尽管不能使用new运算符创建该对象,但该对象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法。
5、抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必须要有的行为标准。抽象类声明的对象可以成为其子类的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出具体的行为。抽象类中的抽象方法,可以由子类去实现,即行为标准的实现由子类完成
6、所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。
抽象类也可以继承抽象类和实现接口,实现接口的话可以不用实现接口的方法
2、接口
1、使用关键字interface来定义一个接口。接口的定义和类的定义十分相似,分为接口声明和接口体,例如:
interface A{
final int MAX = 100;
void add();
float sum(float x, float y);
{
2、定义接口包含接口声明和接口体,和类不同的是,定义接口时使用interface来声明自己是一个接口,格式如下:
interface 接口的名字
3、接口体中包含常量的声明(接口中没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所以常量的访问权限一定都是public的,而且是static常量(允许省略public、static、final修饰符),所有的抽象方法的访问权限一定都是public的(允许胜利public、abstract修饰符),例如:
interface A{
public static final int MAX = 100; //等价写法:int MAX = 100;
public abstract void add(); //等价写法:void add();
{
4、Java不支持多继承,所以一个类只能继承一个父类,但能实现多个接口,例如:
class Dog extends Animal implements Eatable,SleepAble
5、如果父类实现了某个接口,那么子类也就自然实现了改接口,子类不用显示的使用关键字implements声明实现该接口。
6、接口也可以被继承,即可以通过关键字extend声明一个接口是另外一个接口的子接口,由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
7、通过import语句不仅可以引入包中的类,也可以引入包中的接口,例如:
import java.io.*;
8、程序可以用接口名访问接口中的常量(接口名.常量),但是如果一个类实现了接口,那么该类可以直接通过该常量的名字在类体中使用该接口中的常量。
3、接口和抽象类的比较
1、抽象类和接口都可以有abstract方法。
2、接口中只可以有常量,不能有变量;而抽象类中既可以有常量,也可以有变量。
3、抽象类中也可以有非抽象方法,接口不可以。
在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。如果某个问题不需要继承,只是需要若干个类给出某些重要的抽象方法的实现细节,就可以考虑使用接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)