抽象类和接口

抽象类和接口

  • 定义抽象类:包含抽象方法的类,抽象方法只有方法声明,没有方法实现的方法称为”抽象方法”抽象类是对问题领域进行分析后得出的抽象概念,是对一批看上去不同,但是本质上相同的具体概念的抽象。例如:定义一个动物类Animal,该类提供一个行动方法action(),但不同的动物行为方式是不一样的,马儿是跑,鸟儿是飞,此时就可以将Animal定义成抽象类,该类既能包含action()方法,又无须提供其方法实现(没有方法体)。抽象类和抽象方法必须使用”abstract”关键字来修饰。

  • 定义抽象类和抽象方法的规则如下:

    1. abstract关键字放在class前,指明该类是抽象类;
    2. abstract关键字放在方法的返回类型前,指明该方法是抽象方法,抽象方法没有方法体;
    3. 抽象类不能被实例化即无法使用new关键字直接创建抽象类的实例,即使抽象类中不包含抽象方法也不行;
    4. 一个抽象类中可以含有多个抽象方法,也可以含有已实现的方法;
    5. 抽象类可以包含多个抽象方法,但不能通过构造方法创建实例,可在子类创建实例时调用;
    6. 定义抽象类有三种情况:直接定义一个抽象类;或继承一个抽象类,但没有完全实现父类包含的抽象方法;或实现一个接口,但没有完全实现接口中包含的抽象方法

    Tips:abstract关键字不能用来修饰成员变量和构造方法,即没有抽象变量和抽象构造方法的说法。abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此抽象方法不能定义为private,即private和abstract不能同时修饰方法。abstract也不能和static,final或native同时修饰同一方法。

  • 接口定义了某一批类所需要遵守的公共行为规范,只规定这批类必须提供的某些方法,而不提供任何实现。接口体现的是规范和实现分离的设计哲学。让规范和实现分离正是接口的好处,让系统的各模块之间面向接口耦合,是一种松耦合的设计,从而降低各模块之间的耦合,增强系统的可扩展性和可维护性

  • Java只支持单一继承,不支持多重继承,即一个类只能继承一个父类,这一缺陷可以通过接口弥补。Java允许一个类实现多个接口,这样使程序更加灵活,易扩展。一个接口可以继承多个父接口,但接口只能继承接口,不能继承类;在接口体里可以包含静态常量,抽象方法,内部类,内部接口以及枚举的定义,从Java8版本开始允许接口中定义默认方法,类方法;与类的默认访问符不同,接口体内定义的常量,方法等都默认为public,可以省略public关键字,即当接口中定义的常量或方法不写public,其访问权限依然是public。
  • implement关键字用于实现接口;一个类可以实现多个接口,接口之间使用逗号进行间隔;一个类在实现一个或多个接口时,这个类必须完全实现这些接口中定义的所有抽象方法,否则该类必须定义为抽象类;一个类实现某个接口时,该类将会获得接口中定义的常量,方法等,因此可以将实现接口理解成一种特殊的继承吗,相当于实现类继承了一个彻底抽象的类。与抽象类一样,接口是一种更加抽象的类结构,因此不能对接口直接实例化,可以声明接口变量,并用接口变量指向当前接口实现类的实例,使用接口变量指向该接口的实现类的实例对象,这种使用方式也是多态性的一种体现。
  • 接口和抽象类有很多相似之处,都不能被实例化,需要被其他类实现或继承,接口和抽象类的类型变量都可以指向其实现类或子类的实例对象,接口和抽象类都可以包含抽象方法,实现接口或继承抽象类时都必须实现这些抽象方法。
  • 接口和抽象类的区别

    1. 接口体现的是一种规范,这种规范类似于总纲,是系统各模块应该遵循的标准,以便各模块之间实现耦合,以及通信功能;抽象类体现的是一种摸版式设计。抽象类可以被当成系统实现过程中的中间产品,该产品已实现了部分功能但不能当成最终产品,必须进一步完善,而完善可能有几种不同的方式。
    2. 接口只能有抽象方法,默认方法和类方法,不能有其他实现的方法;抽象类则既可以有抽象方法,也可以有已经实现的方法;
    3. 接口中定义的变量都是最终的静态常量;抽象类中的定义的变量与普通类一样,默认是缺省;
    4. 接口中定义的方法都默认缺省的是public;抽象类则与类一样是默认缺省的;
    5. 接口不包含构造方法,抽象类可以包含构造方法,抽象类的构造方法不是用于创建对象,而是让其子类调用以便完成初始化操作;
    6. 一个类最多只能有一个直接父类,包括抽象类;一个类可以直接实现多个接口,一个接口可以有多个父接口。

    Tips:实现一个接口,但没有完全实现接口中包含的抽象方法的类是抽象类。继承一个抽象类,但没有完全实现父类包含的抽象方法的类是抽象类。一个类可以继承抽象类的同时实现一个或多个接口。implements关键字用于实现接口。不能对接口直接实例化。接口的继承与类的继承不一样,接口完全支持多重继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值