Java 深入学习(3) —— 抽象类(Abstract Class) 与 接口(Interface)的区别

抽象类(Abstract Class)


Java 提供一个叫 抽象方法 的机制,这种方法是不完整的,仅有声明而没有方法体。

abstract void f();

包含抽象方法的类叫做 抽象类。如果一个类包含一个或者多个抽象方法,则该类必须被限定为抽象的。

如果从一个抽象类继承,并想创建该新类的对象,就必须为基类中的所有抽象方法提供方法定义。

使某个类成为抽象类并不需要所有的方法都是抽象的,所以仅仅需要将某些方法生命为抽象的即可。


接口(Interface)


interface关键字 产生一个完全抽象的类,它根本没有提供任何具体实现。它允许创建者确定方法名、参数列表、返回类型,但是没有任何方法体。接口中提供了形式,而未提供任何具体实现。

interface关键字 前面添加 public 关键字(仅限于该接口在于其同名的文件中被定义)。

如果不添加 public 关键字,则它只具有包访问权限,这样它就只能在同一个包内使用。

接口也可以包含,但这些域隐式的是 staticfinal的。

可以选择在接口中显示地将方法声明为 public,但即使不这么做,它们也是 public 的。

使用接口的核心原因:

  1. 为了能够向上转型为多个基类型
  2. 防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口

接口优于抽象类的原因


最明显的区别:
抽象类允许包含某些方法的实现,但是接口则不允许。

更为重要的区别:
为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为Java 只允许单继承,所以,抽象类作为类型定义受到了极大地限制。

原因:

1、现有的类可以很容易被更新,以实现新的接口。

例如:当Comparable接口被引入到Java平台中时,会更新许多现有的类,以实现 Comparable接口。一般来说,无法更新现有的类来扩展新的抽象类。

2、接口是定义mixin(混合类型)的理想选择。

例如:Comparable是一个mixin接口,它允许类表明它的实例可以与其他的可相互比较的对象进行排序。这样的接口之所以被称为 mixin,是因为它允许任选的功能可被混合到类型的主要功能中。

3、接口允许构造非层次结构的类型框架。

例如:我们有一个接口代表一个singer,另一个接口代表一个songwriter。但有些 singer 本身也是 songwriter。这种情况不适合层次结构。

Reference


  1. 《Java编程思想》第九章接口 P170
  2. 《Effective Java》第18条,接口优于抽象类 P82
  3. 深入理解Java的接口和抽象类 http://www.cnblogs.com/dolphin0520/p/3811437.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值