对于面向对象编程来说,抽象是它的一大特征。而在Java中,可以通过两种形式体现OOP的抽象:接口和抽象类。在项目实战中会经常用到,尤其是接口,那二者之间有怎样的联系呢,又是怎样区分的呢,接下来就让我们一起来学习一下抽象类和接口吧!
简单来说,抽象类是一种模板式设计,而接口是一种行为规范,是一种辐射式设计。
什么式模板式设计?
大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。
什么是辐射式设计?
比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
小例子:门和报警器的例子
门和报警器:
门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念,但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。
1.相同点:
A.两者都不能直接被实例化。
B.都是对事务行为和对象的抽象,形成一定的设计模式。
2.不同点:
- 一个类只能继承一个抽象类,但可以实现多个继承
- 抽象类中可以包含静态代码块和静态方法,接口则不能。
- 接口方法都是抽象的,抽象类可以同时包含抽象和非抽象的。
- 实现接口必须要实现所有方法,而抽象类可以不用全部实现抽象方法,但是其子类也得是抽象类
- 两者都不能直接实例化,要实例化的话就涉及到多态了。
抽象类:
1、包含一个或多个抽象方法的类本身必须被声明成抽象的。
2、除了抽象方法之外,抽象类还可以包含具体数据和具体方法
3、扩展抽象类的两种选择(抽象方法的具体实现在子类中):
A、 抽象类中定义部分抽象类或不定义抽象类方法,这样就必须将子类也标记为抽象类。
B、定义全部的抽象方法,这样子类就不是抽象的了
4、不能直接被实例化,可以间接使用
5、一个类如果继承一个抽象类,必须实现该抽象类里声明的抽象方法
若不实现,需要将自己声明为抽象类(这可能会是个提问)
接口:
1、一个类可以实现(implement)一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象
2、接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义
3、接口中的所有方法自动地属于public,因此,声明方法时,不必提供关键字public,不过,实现接口时,必须把方法声明成public,否则,编译器将认为这个方法的访问属性是包可见性,即类的默认访问属性。
4、接口中不能含有实例域或静态方法,但却可以包含常量
5、接口不能被实例化
6、接口中定义的方法都为抽象方法
注:当多个接口中有同名、同参、返回值类型不同的方法时,会产生命名冲突(因为接口支持多继承,防止出现二义性)
7、接口之间允许多继承(java只在接口允许多继承)
8、Java 8用默认方法与静态方法这两个新概念来扩展接口的声明
接口和抽象类该什么时候用?
1、接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则
2、抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。
理解:
1、抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。...
2、抽象类不能直接new对象,它只能被继承,而且单一继承。也就是说它把公共的东西抽象出来,子类可以调用父类的方法,也可以拓展自己的功能,就像子承父业一样。接口可以被多次继承,这是和抽象类的最大区别。也就是说接口是一个公共用品谁都可以拿来用的,不想抽象类,不是他的子类是不能调用的。希望对你有帮助
3、当描述一组方法的时候使用接口 当描述一个虚拟的物体的时候使用抽象类
二者区别:
1、抽象类和接口都不能直接实例化,如果要实例化(涉及动态绑定),抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
2、抽象类要被子类继承,接口要被类实现
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
5、抽象方法要被实现,所以不能是静态的,也不能是私有的
6、抽象类主要用来抽象类别,接口主要用来抽象功能.
7、抽象类可以有构造方法,接口中不能有构造方法。