抽象类(abstract 修饰于class前)是指不允许被实例化的类,只能被继承;
抽象方法是没有方法体的方法(abstract 修饰于返回类型void前),只有方法头的声明,用一个分号代表方法体。
Public Abstract methodname();
抽象类中定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现一个相同名字的方法(接口:抽象方法就像一个插头,而不同的子类就像不同的电器,可是充电都用二口插头)
抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。
1、抽象类通常包含抽象方法,但也可以没有抽象方法(0个至多个)。
2、抽象类可以包含非抽象方法,子类继承之后就拥有该属性。
3、含有抽象方法的类必须声明为抽象类。
4、如果子类是非抽象的,那么它就必须实现抽象类中定义的所有抽象方法。
5、如果父类中已有同名的abstract方法,则子类中就不能再有同名的抽象方法。
6、abstract不能与final并列修饰同一个类。
7、abstract 不能与private、static、final或native并列修饰同一个方法。
比如说,我在纸上画一个饼/饼谱(抽象类),饼有个“吃到嘴里沾一嘴芝麻”的方法。我可以在饼上画几个点假装是芝麻,这时候“沾芝麻方法”就是个抽象方法,因为它不会真的掉芝麻;我也可以在纸上的饼蘸点儿真芝麻,这时候“沾芝麻方法”就是个有实现的方法。但是用哪个方法都可以,因为没人会去真的吃画的饼吧(不会实例化)。
当要真的去照着这个图烤一个饼(非抽象子类,即为继承),那这个子类的“吃到嘴里沾一嘴芝麻”的方法就必须有具体的实现。否则烤出来,一吃,没芝麻啊!食客非上消协投诉不可(即一定要实现画谱上的特色吃法:芝麻)。
接口(interface)
interface定义一个接口,一个类通过关键字implements声明要实现一个接口,并必须具体实现接口的方法。
1、成员变量 都是常量,必须赋值初始化(public static(静态) final(常量)可省略不写)
2、成员方法 都是公共抽象,没有方法体(public abstract可省略不写)
3、没有构造方法 不能被实例化
4、一个接口不能implements接口,但它可以继承多个其它的接口

5、 一个类只能继承(extends)一个直接的父类,但可以实现(implements)多个接口,间接的实现了多继承
6、当一个类实现(implements)接口,必须实现接口中的所有抽象方法
7、接口不允许实例化,但是类似继承,能够强制转换(动态)
8、通过接口,可以方便地对已经存在的系统进行自下而上的抽象,对于任意两个类,不管它们是否属于同一个父类,只有它们存在相同的功能,就能从中抽象出一个接口类型.对于已经存在的继承树,可以方便的从类中抽象出新的接口,但从类中抽象出新的抽象类却不那么容易,因此接口更有利于软件系统的维护与重构.对于两个系统,通过接口交互比通过抽象类交互能获得更好的松耦合.
9、接口是构建松耦合软件系统的重要法宝,由于接口用于描述系统对外提供的所有服务,因此接口中的成员变量和方法都必须是public类型的,确保外部使用者能访问它们,接口仅仅描述系统能做什么,但不提供具体的实现,所有接口中的方法都是抽象方法,接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量.
二、 比较抽象类与接口
抽象类与接口都位于继承树的上层
相同点
1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统之间的送耦合
2, 都不能被实例化
3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现
不同点:
1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势限制了多继承,而接口中只能包含抽象方法.由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类
2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这一优势是以不允许为任何方法提供实现作为代价的, 为什么Java语言不允许多重继承呢?当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许一个类有多个直接的父类,那么会使绑定规则更加复杂,
3, Java接口本身必须非常稳定,Java接口一旦制定,就不允许随遇更加,否则对外面使用者及系统本身造成影响
4, 用抽象类来定制系统中的扩展点,抽象类来完成部分实现,还要一些功能通过它的子类来实现

浙公网安备 33010602011771号