接口(interface)
接口与类平级,可以很好的解决单继承的限制(eg:一个子类想继承两个或多个父类的方法)
一、接口的特点
(1)接口本身不能创建对象,只能创建接口的实现类对象,接口类型的变量可以与实现类的对象构成多态引用。
(2)接口的成员只能是如下几个:
A:公共的静态常量( public static final可以省略)
B:公共的抽象方法(public abstract可以省略)
C: JDK1.8之后,公共的静态方法(public static,其中public可以省略)
D:JDK1.8之后,公共的默认方法(public default,其中public可以省略)
E: JDK1.9之后,私有的方法(private,不能省略)说明接口中是没有构造器等其他成员。
(3)类可以实现接口,而且支持多实现
【修饰符】class 实现类名 implements 父接口们 {
}
父接口们:每一个接口使用逗号分隔
如果一个类同时继承父类又实现接口,要把继承写在前,实现写在后。
【修饰符】class 实现类名 extends 父类 implements 父接口们{
}
一般,子类继承父类,称为父子类,类实现接口,通常称为实现类和父接口。
比喻:直接父类->亲生父亲,只有一个
父接们->干爹们
(4)接口与接口之间也可以继承,而且是多继承。
总结:
类->类 extends 单继承
类->接口 implements 多实现
接口->接口 extends 多继承
(5)实现类实现接口时,必须实现接口的所有抽象方法。如果实现类没有实现接口的抽象方法,那么实现类就要声明为抽象类(6)实现类可以选择重写接口的默认方法。在实现类中重写默认方法时,要把"default" 去掉。因为类里面没有默认方法一说。(7)接口的静态方法不能被实现类继承,也不能被实现类重写。
二、关于接口
1、接口声明格式:
【修饰符】 interface 接口名{
}
2、接口的成员
(1)接口中不允许声明非静态变量之外的成员变量,换句话说,如果要声明成员变量,只能声明公共的静态变量
public static final ,这三个单词可以省略不写
(2)JDK1.8之前,接口中只允许有公共的抽象方法,不允许有其他方法。
public abstract ,这两个单词可以省略不写
(3)JDK1.8之后,接口允许声明公共的静态方法
public static , 其中public允许省略,static不允许省略
(4)JDK1.8之后,接口允许声明公共的默认方法
public default , 其中public允许省略,default不允许省略
为什么JDK1.8之前,只允许有公共的抽象方法?
因为接口代表的是行为标准,它只是规定了方法的“签名”。
方法 = 方法头 + 方法体
方法头又称为方法签名,【修饰符】 返回值类型 方法名(【形参列表】);
方法体:{语句}
方法签名中就已经能看出,如何使用这个方法,以及这个方法的功能(因为方法名是见名知意的一个标识符,代表方法功能)。
至于方法体,不同的实现类(如果拿USB作比喻的话,不同的具体设备的实现标准是不同的)
为什么JDK1.8之后,又引入了静态方法和默认方法呢?
因为随着JDK的版本越来越多,里面的API难免需要升级。
早期如果定义了一个接口,它包含1个抽象方法;
现在JDK版本升级了,想要给这个接口增加一个方法,如果按照JDK1.8之前的原则,只能增加抽象方法
如果给这个接口增加抽象方法,就回导致它所有的实现类,全部要跟着升级,重新写这个新的抽象方法,这个影响就太大了
为了避免这个情况的出现,允许接口中出现默认方法。
为什么JDK1.8之后,又引入了静态方法呢?
原来很多接口,针对它的工具类性质的方法,都是单独用另一个类实现的。
所以JDK1.8就觉得,可以被针对这个接口的工具类性质的静态方法,干脆方法哦接口中就好,少一个.java文件。
(5)JDK1.9之后,接口中允许出现私有方法。
为什么JDK1.9之前,接口中的成员全部是公共的?
因为接口是代表标准,标准是给大家看到,给大家遵守的,所欲需要公开。
为什么JDK1.9之后,要增加私有方法呢?
因为自从JDK1.8运行在接口中出现默认方法和静态方法这种有方法体的形式之后,接口中出现了很多冗余的代码,很多当打实现有公共部分。
三、接口成员的使用规则
1、如何使用接口的公共的静态常量? 接口名.常量名 (eg: Flyable.MAX_SPEED)
2、如何使用接口静态方法?
接口名.静态方法 ( eg: void method ( ) )
3、子类可以继承父类的接口吗? 可以的
不过需要强调的是,子类可以继承父类的静态方法,即子类名.父类的静态方法是可以的;实现类不可以继承接口的静态方法,即实现类名,父接口的静态方法是错误的(eg: Bird.method( ) ; 这种写法就是错误的)
子类不能重写父类的静态方法。
实现类也不能重写接口的静态方法
总结:接口的静态只有一种方式可以用,即“ 接口名.静态方法 ”
4、如何使用接口的抽象方法?
只能通过实现类实现抽象方法,然后由实现类调用;
5、如何使用接口的默认方法?只能通过实现类对象使用