抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
接口的方法默认是public,所有方法都是抽象方法,在接口中不能有方法的实现(Java8开始接口方法可以有默认实现),抽象类可以有非抽象的方法
接口的本质是标准,规范,指定好后大家都要遵守。
//飞行接口interfaceFlyable{//全局常量publicstaticfinalintMAX_SPEED=7900;//第一宇宙速度intMIN_SPEED=1;//省略了//抽象方法publicabstractvoidfly();//省略了voidstop();}
//************************************************************//接口多继承interfaceA{voidmethod1();}
//攻击性接口interfaceAttackable{voidattrack();}
接口和抽象类的异同
publicclassInterfaceTest{publicstaticvoidmain(String[]args){Systeout.println(FlyablMAX_SPEE;Systeout.println(FlyablMIN_SPEE;Planeplane=newPlane();planfly();}}
接口的特征
如果接口定义的是变量的话,比如接口中我定义了变量a,而且我们通过实现本接口的类B的对象改变了a的值,那么其他实现本接口的类B、类C中的变量a得知都要随着改变,那么就会造成想要实现本接口的类却不知道接口里现在变量a到底是什么值,就会造成混乱。
//子弹类实现攻击接口和飞行接口classBulletextendsObjectimplementsFlyable,Attackable{
接口使用interface来定义java中接口和类是并列的两个结构如何定义接口:定义接口中的成员1JDK7及以前:只能定义全局常量和抽象方法全局常量:publicstaticfinal的(可省)抽象方法:publicabstract的2JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法,默认方法接口中不能定义构造器java开发中,接口通过让类去实现(implements)的方式来使用如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类java类可以实现多接口格式:classAextendsBimplementsC,D,E//继承父类并且实现接口接口和接口之间可以继承,而且可以多继承接口的具体使用,体现了多态性接口,实际上可以看作是一种规范
//飞机类覆盖了接口中的所有抽象方法,则此飞机类就可以实例化classPlaneimplementsFlyable{@Overridepublicvoidfly(){Systeout.println('飞机起飞');}@Overridepublicvoidstop(){Systeout.println('飞机减速停止');}}
一方面,有时必须从几个类中派生出一个子类,继承他们的所有属性和方法。但是java中不支持多继承。引出接,接口可以实现多继承的效果
接口中的实例变量默认是final类型的,而抽象类中则不一定
为什么接口中只能定义常量?
提高程序的可扩展性
另一方面,有时必须从几个类中抽取出一些共同特征,而他们之间又没有is-a的关系,只具有相同的行为特征。例:摄像头、充电器、MP3机、手机、数码相机都支持USB连接
一个类实现接口的话要实现接口的所有方法,而抽象类不一定
//风筝类实现接口,没有覆盖接口中所有的抽象方法,它仍是一个抽象类abstractclassKiteimplementsFlyable{@Overridepublicvoidfly(){}}
接口就是规范,定义的是一组规则。继承体现的是一个'是不是'的关系,而接口则实现是'能不能'的关系。
一个类可以实现多个接口,但最多只能继承一个抽象类
接口的好处:
代码实现
降低耦合度
文章为作者独立观点,不代表观点