接口和抽象类的区别
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口和抽象类的区别相关的知识,希望对你有一定的参考价值。
抽象类的定义
在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,我们把这种类定义为抽象类。
抽象类的特征
不能用来实例化对象,所以抽象类必须被继承才能够被使用,其他的功能和普通类相同。
一个类只能继承一个抽象类。
抽象类的修饰符不能是private。
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
构造方法,类方法不能声明为抽象方法。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
接口的定义
在软件工程中,接口泛指供别人调用的方法。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。
注意:
接口中所有的方法不能有具体的实现,``也就是说,接口中的方法必须都是抽象
方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”
,并且一般情况下不在接口中定义变量。
在抽象类
中,可以包含一个或多个抽象方法
,但是在接口
中,所有的方法必须是抽象
的,不能有方法体,比抽象类更加的抽象。
接口规定一个类必须做什么而不规定他如何去做。
接口中声明的成员变量默认都是public static final的,必须显示的初始化。
因而在常量声明时可以省略这些修饰符。是若干常量和抽象方法的集合。
接口的特征
接口中只定义抽象方法,这些方法默认都是public abstrac
t的,在方法声明时可以省略这些修饰符。
在接口中定义实例变量,非抽象实例方法以及静态方法都是不允许
的。
接口中没有构造方法,也不能被实例化。
一个接口不能实现另一个接口,但是可以多继承其他接口。
接口必须通过类来实现它的抽象方法。
如果一个类不能实现完接口中的抽象方法,那么这个类我们应该设计为抽象类。
不允许创建接口的实例,但是允许定义接口类型的引用变量引用实现该接口的类的实例。
接口和抽象类的区别
1.应用场景
抽象类是一种对事物的抽象,即对类抽象,
而接口是对行为的抽象
ArrayList LinkedList List
举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将飞行这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将
飞行设计为一个接口Fly,包含方法fly(
),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个
"是不是"的关系,而 接口 实现则是
"有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
抽象类作为很多子类的父类,它是一种模板式设计。
接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt
C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt
C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
2.语法层面
1.方法:抽象类可以提供方法的具体实现细节, 而接口中只能有public abstract 方法;
2.成员变量:抽象类的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
3.静态代码块和静态方法: 而抽象类可以有静态代码块和静态方法,接口中不能有静态代码块和静态方法
4.继承:一个类只能继承一个抽象类,而一个类可以实现多个接口
使用
4.使用:
class Test implenments 接口1,接口2,接口3
class MyArrayList extends 类 implenments 接口1,接口2{
}
以上是关于接口和抽象类的区别的主要内容,如果未能解决你的问题,请参考以下文章