走进java_接口和抽象类的区别
抽象类:
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的
信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上
相同的具体概念的抽象。
抽象类的定义: 如果一个类被用abstract关键字修饰,则该类为抽象类。
我们先来看一个例子:
所有的手机都会有开关和打电话这些功能,所以我们就把它申明成一个抽象类
然后在子类当中重写这些方法,然后子类就会继承了父类的所有抽象方法。
但是子类TelPhone 不想实现这个close这个方法了。那么它把这个方法定义成抽象方法,再把自己声明成一个抽象类,谁继承了TelPhone谁再去实现这个方法。
总结:
1:一个类一旦被声明成抽象类那么它就一定不能被实例化。
2:如果一个类没有实现父类的抽象方法那么这个类必须声明成为抽象类。
3:抽象类当中也可以有普通的方法,可以不被实现。
4:含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
5:abstract不能与final并列修饰同一个类。
接口
上述的例子中,假设有些手机是智能手机它具有连接WIFI 的功能,但是有的手机并不具备这个功能,这时候用接口就比较方便了,这个时候我就可以定义一个接口,有的手机具有链接WIFI这个功能的时候,它就去实现这个接口。
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
接口是一种比抽象类更加抽象的概念。抽象类中可以有普通方法,但是接口当中所有的方法必须是抽象方法。Java当中为了数据的安全不允许多继承,所以接口在某种意义上就是为了弥补这个缺陷的,一个类可以实现多个接口。
接口的特点:
1:接口当中所有的成员变量默认的都是 public static final(可以省略)类型的。而且必须显示初始化。
2:接口当中所有的方法都默认是 public abstract (可以省略)类型。
3:接口当中所有的方法都没有方法体,不能实例化。
4:接口当中野没有构造方法,不能被实例化。
5:当一个类实现了某个接口是,它必须实现该接口的所有方法。否则这个类必须声明成抽象类。
接口和抽象类的区别:
语法层次的区别:
1:在抽象类当中,抽象类可以声明任意范围类的数据,也可以声明非抽象方法,而在接口中只能定义静态的, 不能修改的数据成员,并且所有的方法必须是抽象的。在某种程度上,接口是极为抽象的概念。
2:一个类只能继承一个抽象类,但可以实现多个接口。
3: 接口当中不能有静态的代码块以及方法,而抽象类当中可以有静态的抽象类和方法。
设计理念层面:
1: 抽象类在Java语言中体现了一种继承关系,要想使得承关系合理,父类和派生类之间应该存在"is a"关系,即父类和派生类在概念本质上应该是相同的。 对于接口来说则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约(功能)而已,接口表示的是”like a” 的关系。
2: 接口和抽象类的概念不一样,抽象类是对根源的抽象,接口是对动作的抽象,抽象类是对整个类的整体的抽象(属性,方法),而接口只是局部的抽象。