隐藏

抽象类与接口区别

发布:2023/12/7 15:49:12作者:大数据 来源:大数据 浏览次数:432

一、抽象类

在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类是用来捕捉子类的通用特性的 。它不能不能使用new关键字来实例化对象,只能被继承,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。

二、接口类型

Java中接口使用interface关键字修饰。接口是抽象方法的集合,比抽象类更抽象。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。

对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更,都具有此方法,就像ppt母板一样。;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动,即都需要实现新增的这个方法,也就是契约。

 

抽象类主要用于对一些事物公共属性或通用方法进行抽象,而接口主要实现了功能的拓展。

门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念

open() close()

比如,门可以有开门、关门,可以抽象出来,但有些门比如报警门,他不具有开和关,但具有报警功能,而如果将报警方法写到抽象类里,那所有有继承的门都具有报警、开、关了。但这样肯定不符合需要,这种情况就需要用接口来实现,可以定义一个报警门接口类型,对于需要的门可以实现这个接口就有报警功能了,如果这个门需要开、关,可以继承抽象对象,这样可以根据需要进行自由组装了。

具体可以参考如下代码:

abstract Door{

abstract void open();

abstract void close();

}

interface AlarmDoor{

void alarm();

}

普通门

public class MyDoor extends Door{

@Override

void open(){

//...

}

@Override

void close(){

//...

}

}

报警门

public class MyAlarmDoor implements AlarmDoor{

@Override

public void alarm(){

//...

}

}

既有开关,又有报警功能

public class MyDoor extends Door implements AlarmDoor{

//...

}

二者的相同点

都不能直接被实例化,必须由子类(继承的抽象类或实现接口的类)进行实例化

二者的区别

类型 abstract class Interface
定义 abstract class关键字 Interface关键字
继承 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 接口只可以继承接口(一个或多个);子类可以实现多个接口
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符
方法实现 可定义构造方法,可以有抽象方法和具体方法 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现
实现方式 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
作用 了把相同的东西提取出来,即重用 为了把程序模块进行固化的契约,是为了降低偶合

三、抽象类和接口的应用场景

1、如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

2、如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

3、如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

声明:本站内容来源于原创和互联网,尊重作者版权,转载请注明来源网址,欢迎收藏,谢谢!