一、接口
1.概念
接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。
2.接口的特点
就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。
接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图,给其它类提供行为说明。
一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。
如果一个类实现了一个接口中要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是一个抽象类。(必须记住:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类。)接口不能被实例化,而且在接口中所列的所有方法必须在别处被重写。
一个JAVA库中接口的例子是:Comparator 接口,这个接口代表了“能够进行比较”这种能力,任何类只要实现了这个Comparator接口的话,这个类也具备了“比较”这种能力,那么就可以用来进行排序操作了。
一个接口看起来就像一个类,除了:
关键字interface替换了关键字class, 以及接口中的方法只有方法头加分号结尾,没有方法主主体。
3.接口的使用
(1)格式
public interface 接口名称
{
(方法头。。。)
}
接口中的所有方法都是public ,抽象方法。
一个类可以实现一个或者多个接口。
(2)属性
public interface Doable
{
int FIELD1 = 1, FIELD2 = 2;
(Method headers...)
}
Interface2,
Interface3
(3)继承接口
与类的继承类似,接口之间也可以继承。
接口只能继承接口,而不能继承类。
与类的继承类似,接口的继承也表达了“is-a”的逻辑。
与类只能继承一个父类不同,接口可以继承多个父接口,彼此以逗号隔开(各父接口的顺序可任意),表达的逻辑是子接口既是一种父接口1,也是一种父接口2,… 。
二、抽象类
1.概念
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之 为抽象方法,含有抽象方法的类我们称之为抽象类。
抽象类可以理解为是一个只有方法声明没有方法体的特殊类。
2.使用相关
包含抽象方法的类就会自动变成抽象类,因此必须以abstract关键字声明。
如果派生类没有重写抽象方法,编译器会报错。
抽象方法被用来确保派生类会实现这个方法。
实例:Geometry.java, Circle.java, Rectangle.java GeometryObjectDemo.javaCompSciStudentDemo.java若类含有抽象方法,则类必须以abstract关键字声明为抽象类。
public abstract class 类名
抽象类可以含零至多个普通方法,也可以含零至多个抽象方法。
不论抽象类是否含抽象方法,其都不允许实例化,即不能创建抽象类的对象,因为其描述的是抽象概念。它只能作为其他类的基类。
若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中的所有抽象方法重写为带方法体的普通方法,否则子类仍必须是抽象类。
3.实例
三、比较
接口是对动作的抽象,抽象类是对本质的抽象。
1.概念
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质的区别。这个“吃东西”是一个动作,你可以把“吃东西”定义成一个接口,然后让两个类去实现它的方法。
所以,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等。
2、语法
(1)语法层面
抽象类与接口是Java提供的对现实世界中的实体进行抽象的两种机制,二者具有很大的相似性,同时也具有明显的区别。
3、使用情况
a.抽象类 和 接口 都是用来抽象具体对象的,但是接口的抽象级别最高;
b.抽象类可以有具体的方法和属性, 接口只能有抽象方法和不可变常量(final);
c.抽象类主要用来抽象类别,接口主要用来抽象功能;
d.抽象类中不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的;
e.抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。
4、使用方向
当你关注一个事物的本质的时候,用抽象类;
当你关注一个操作的时候,用接口。
四、小结
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。