接口

抽象类是从多个具体类中抽象出来的模板。而具体类中不同的行为,在抽象类中用抽象方法的形式定义,在具体的子类来实现。

如果将这种抽象进行得更彻底,则可以提炼出一种更为特殊的"抽象类"——接口(interface)。在接口中,所有方法都是抽象方法,所有方法都不提供具体的实现。

因为接口中全部都是抽象方法,所以也不能实例化。类不能继承接口,只能"实现"接口所定义的方法。如果一个类实现了接口,那么它将继承接口中的抽象方法。除非实现接口的类是抽象类,否则接口中所有的方法都必须在实现类中进行定义。

接口与类在以下方面相似:

  • 接口可以有任意数量的方法;
  • 接口保存为以".java"为后缀名的文件,接口名需要与文件名匹配;
  • 接口编译后是后缀名为".class"的字节码文件;
  • 在包中的接口,其相应的字节码文件必须放置在和包名称相匹配的一个目录结构中。

然而,接口与类之间也有几个不同之处,包括:

  • 接口不能被实例化;
  • 接口不包含任何构造器;
  • 接口中的所有方法都是抽象的;
  • 接口中不能包含实例成员变量。唯一可以出现在接口中的成员变量必须是同时声明为static和final;
  • 接口不能被一个类继承,只能被一个类来实现;
  • 一个接口能够继承多个接口。

接口不是类。虽然编写接口类似于编写一个类,但它们是两个不同的概念。类描述了对象的属性和行为,而接口包含了一个类需要实现的行为。

接口声明

接口具有下列性质:

  • 接口默认是抽象的。在声明接口时,不需要使用关键字abstract;
  • 接口中的每一个方法默认也是抽象的,所以也不需要关键字abstract;
  • 接口中的方法默认访问级别是public。 在编写接口的时候通常用public关键字,但是如果我们不显式地将接口中的方法声明为public,它仍然将是public的。

接口实现

接口不能被实例化,因为接口中的方法都是抽象的,所以需要一个类来实现接口。当接口被一个类实现的时候,我们可以简单地认为类与接口之间签订了一个合同,类必须要实现接口所定义的行为,也就是是要履行合同。如果类不能执行接口中所定义的所有行为,那么,类必须声明自己是一个抽象类。

更具体来说,类实现接口时有两个选择:

  • 实现接口中定义的所有方法;
  • 声明自己为抽象类。

类使用关键字implements来实现接口。关键字implements放在类声明的extends部分之后。

接口的应

  • 接口可以用于暴露类的行为,允许类的用户通过接口的实现类来使用接口中的方法;
  • 接口可以用于强制一个类具有某些行为。

在接口中声明成员变量

接口可以包含成员变量,但是成员变量只能用static和final关键字共同来修饰。由于接口不能被实例化,所以成员变量必须被声明为static,而声明为final是为了程序的可靠性。

接口中包含非静态成员变量是没有意义的,这是因为接口不能够被实例化。静态成员变量的创建不需要内存中存在类实例,但是非静态成员变量只有对象被实例化以后才会被创建。接口中的静态属性在接口被JVM加载时就会被分配内存空间。

接口继承

一个接口能够继承另外的一个接口,这类似于一个类能够继承另外一个类。关键字extends被用于继承接口,子接口继承了父接口中的方法。

继承多个接口

我们知道,Java语言不允许多继承,一个类只能继承一个父类。然而,接口不是类,它可以继承多个父接口。在接口多继承中,关键字extends只使用一次,多个父接口之间用逗号分隔。

标记接口

既然接口可以被用来继承,那么在什么情况下使用呢?最常见的情况是发生在当父接口不包含任何方法的时候。

接口与多态

如果一个类实现一个接口,那么这个类的对象就呈现出接口数据类型的特点。对象采用接口形式的这种能力就是多态的一个例子。在本章中我们已经在多处应用了这种特性,现在我们正式介绍多态和接口的细节。

接口与抽象类的区别

接口和抽象类很相像,它们都具有如下特征:

  • 二者都不能被实例化,它们都位于继承树的顶端,用于被其它类实现或者继承。
  • 二者都可以包含抽象方法,实现接口或者继承抽象类的子类都必须实现这些抽象方法。

但是,接口和抽象类的差别非常大。这种差别主要体现在二者的设计目的上。

接口通常做为一个系统与外界交互的窗口,它体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务。对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。

而抽象类通常是做为系统中多个子类的共同父类,体现的是一种模板式设计。它可以被当成系统实现过程中的中间产品,实现了部分功能,其他的功能交给不同的子类来完成。

除此之外,接口和抽象类在用法上也存在如下区别:

  • 接口中只能包含抽象方法;而抽象类中可以包含普通方法。
  • 接口中不能定义静态方法;而抽象类可以定义静态方法。
  • 接口中只能定义静态常量属性,不能定义普通属性;而抽象类既可以定义普通属性,也可以定义静态常量属性。
  • 接口不包含构造器;而抽象类中可以包含构造器。抽象类中的构造器并不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作。
  • 接口中不包含初始化块;而抽象类可以包含初始化块。
  • 一个类最多有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口来弥补Java单继承的不足。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值