接口

                          **接口**

这里写图片描述

     **概述**
如果将这种抽象进行得更彻底,则可以提炼出一种更为特殊的"抽象类"——接口(interface)。在接口中,所有方法都是抽象方法,所有方法都不提供具体的实现。
因为接口中全部都是抽象方法,所以也不能实例化。类不能继承接口,只能"实现"接口所定义的方法。如果一个类实现了接口,那么它将继承接口中的抽象方法。除非实现接口的类是抽象类,否则接口中所有的方法都必须在实现类中进行定义。
接口与类在以下方面相似:
接口可以有任意数量的方法;
接口保存为以".java"为后缀名的文件,接口名需要与文件名匹配;
接口编译后是后缀名为".class"的字节码文件;
在包中的接口,其相应的字节码文件必须放置在和包名称相匹配的一个目录结构中。
然而,接口与类之间也有几个不同之处,包括:
接口不能被实例化;
接口不包含任何构造器;
接口中的所有方法都是抽象的;
接口中不能包含实例成员变量。唯一可以出现在接口中的成员变量必须是同时声明为static和final;
接口不能被一个类继承,只能被一个类来实现;
一个接口能够继承多个接口。

    **接口声明**
在Java语言中,关键字interface用于声明接口。声明接口的格式如下代码所示:
public interface 接口名 {
  //任意数量的final, static成员变量
  //任意数量的抽象方法声明
}
接口具有下列性质:
  接口默认是抽象的。在声明接口时,不需要使用关键字abstract;
  接口中的每一个方法默认也是抽象的,所以也不需要关键字abstract;
  接口中的方法默认访问级别是public。 在编写接口的时候通常用public关键字,但是如果我们不显式地将接口中的方法声明为public,它仍然将是public的。

     **接口实现**
接口不能被实例化,因为接口中的方法都是抽象的,所以需要一个类来实现接口。当接口被一个类实现的时候,我们可以简单地认为类与接口之间签订了一个合同,类必须要实现接口所定义的行为,也就是是要履行合同。如果类不能执行接口中所定义的所有行为,那么,类必须声明自己是一个抽象类。
更具体来说,类实现接口时有两个选择:
  实现接口中定义的所有方法;
  声明自己为抽象类。
类使用关键字implements来实现接口。关键字implements放在类声明的extends部分之后。其语法格式如下:
public class 类名 extends 父类名 implements 接口名

    **接口的应用**
接口有两个同等重要但用法不同的功能:
  接口可以用于暴露类的行为,允许类的用户通过接口的实现类来使用接口中的方法;
  接口可以用于强制一个类具有某些行为。

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

      **与抽象类的区别**
接口和抽象类很相像,它们都具有如下特征:
  二者都不能被实例化,它们都位于继承树的顶端,用于被其它类实现或者继承。
  二者都可以包含抽象方法,实现接口或者继承抽象类的子类都必须实现这些抽象方法。
但是,接口和抽象类的差别非常大。这种差别主要体现在二者的设计目的上。
接口通常做为一个系统与外界交互的窗口,它体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务。对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。
而抽象类通常是做为系统中多个子类的共同父类,体现的是一种模板式设计。它可以被当成系统实现过程中的中间产品,实现了部分功能,其他的功能交给不同的子类来完成。
除此之外,接口和抽象类在用法上也存在如下区别:
  接口中只能包含抽象方法;而抽象类中可以包含普通方法。
  接口中不能定义静态方法;而抽象类可以定义静态方法。
  接口中只能定义静态常量属性,不能定义普通属性;而抽象类既可以定义普通属性,也可以定义静态常量属性。
  接口不包含构造器;而抽象类中可以包含构造器。抽象类中的构造器并不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作。
  接口中不包含初始化块;而抽象类可以包含初始化块。
  一个类最多有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口来弥补Java单继承的不足。

注:        
接口无法实例化,只能由接口的实现类来实例化
抽象类允许非抽象方法存在,接口中只允许抽象方法存在。
接口文件也会编译成字节码文件。
接口方法中,可以不写public
在定义常量时,可以写成public static final, 也可以写成:static final, 也可以写成:final, 甚至可以去掉final

接口的特点:
1、接口文件最后同样也会被编译器编译成   服务接口.class 的字节码文件
2、接口跟抽象类一样,同样不能被实例化
3、接口中的所有方法,都只能定义成抽象方法,不能拥有方法体
4、接口中的所有方法,访问修饰符默认是public,即便不写也是public
5、接口中不能拥有构造器,以及初始化块(静态初始化块)
6、接口中不能定义“成员变量”,只能定义公开的、静态常量
7、接口中可以定义无限个常量,可以定义无限个抽象方法(理论上)
8、接口在使用上来讲,不能被实例化,所有的抽象方法都必须由接口的实现类来实现

类不能继承即接口,只能实现接口
类只能单继承,但是可以多实现。接口之间采用“逗号”间隔

JDK1.8之后,在接口中可以使用default关键字,声明非抽象方法,但是外部访问时,但是真正的访问符,依旧是public,default此时是一个声明关键字,而并不是一个访问修饰符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值