什么是接口?
有什么用?
怎么用?
有哪些特点?
下面听我一一道来。
一、什么是接口?
接口是行为的抽象,是一种规则,那个对象需要使用这种规则就去拿过来实现即可。
打个不太恰当的比喻,奥特曼看过吧?塞罗知道吧?塞罗当年想得到等离子火花塔的力量知道吧?假设,我说的是假设,假设等离子火花塔上有个接口,只要塞罗那个线咔嚓把自己和那个接口一连接上,哎,啪的一下,hei~快啊!塞罗就得到了等离子火花塔的力量了。
再假设,一个盒子,里面封印有绝世武功,盒子有个接口,你想要绝世武功,只要和接口连接上,你就能拥有绝世武功!那么绝世武功就在你身上实现了!是不是很像继承?没错,接口就是从继承体系里延申出来的技术。
构建一个简单的继承体系便于理解:
对于这个继承体系,游泳方法其他三个都要实现,而兔子类没有必要实现,就不能抽取到父类中,怎么办?于是就有了接口这个概念。写一个接口类,里面写上游泳方法,谁用谁继承即可。
不冲突,层次明朗,各司其职。这就是接口的作用。
二、接口与类之间的关系:
1、类与类的关系:继承关系,对于类与类的继承而言,只能单继承,但是可以多层继承
2、接口与类的关系:继承关系,继承了接口的类叫做实现类,用implements关键字实现。
实现类可以实现多个接口,即implements 接口A,接口B.....
3、接口与接口的关系:
也是继承关系,可以存在多层继承,有子接口和父接口。
但是如果要实现最底层的的子接口,那么就需要重写子接口以及其父接口的所有方法
三、接口类成员的特点:
1、成员变量:只能是常量
格式:public abstract final + 变量名;
2、无构造方法
3、成员方法:又分多种情况:
(1) 原来的JDK7只支持写抽象方法
抽象方法的
(2) 后来的JDK8又能够支持可以拥有方法体的方法以及静态方法,前者叫做默认方法,用关键字default修饰;后者叫做静态方法,即用static修饰的方法
默认方法:
格式:public default 返回值类型 方法名(){ }
范例:public default void method( ){ ....}
注意:默认方法不是抽象方法,不需要强制重写;如果要重写,需要去掉default关键字
public可以省略不写,但是default不能省略
如果实现多个接口,多个接口中有重复的方法名字,实行类必须进行重写,因为在调用的时候我们不知道调用那个接口的方法,就会导致混乱
静态方法:
格式:public static 返回值类型 方法名字(){ }
范例:public static void method ( ) { ...... }
注意:静态方法只能通过接口调用,而不能使用实行类名和对象调用
public可以省略,static不能省略
静态方法不是抽象方法,不需要强制重写,而且不能够被重写
(因为只有能被继承的方法才能重写,而1静态方法是不能被继承的)
(3) 再后来的JDK9又能够支持私有成员方法,至于为什么,后面再说。
其中又分为私有的默认方法以及私有的静态方法。
私有默认方法:
格式: private 返回值类型 方法名(){......}
范例:private void method () { ...... }
私有静态方法:
格式:private static 返回值类型 方法名(){.....}
范例:private static 返回值类型 方法名(){.....}
可是,为什么呢?为什么要升级呢?
很简单,随着业务的复杂增加,随之也需要一些相应技术的升级。你想想,你用的APP或者游戏,王者农药隔三岔五就要升级不是吗?QQ都从最初的1.0版本已经升级到了现在的8.几版本了,而且还会再更新。看,这就是一个项目的生命力!试想,假设你写了一个程序,能用到几百年后,想像都刺激激动!因此,要跟进学习,持续不断的学习,才能不断的产出新的创造!
默认方法升级的原因:
设想一个情景:
有一个App1.0版本上线了,但是很快需要升级,要升级为App2.0版本。
随之有某一个接口需要进行功能丰富,需添加10个方法或者干脆更多,怎么办呢?直接加吗?
要知道,实现类必须重写接口中所有的方法。
如果直接加进去,那么原来继承了这个接口的所有实现类就会直接报错!
难道你要逐个找到继承该接口的实现类去一个一个改吗?不可能!直接崩了!
所有,为了解决这个问题,到了JDK8就推出了可以写方法体的默认方法。
即解决了接口新增功能的问题,也解决了新增后原来的实现类不报错的问题!
而这个默认的方法对于实现类不强制重写,也就是谁用谁重写,方便多了!
私有方法的原因:
那么,紧跟着上面的接口丰富,问题又来了,试想,如果接口的方法多了,难免会有几个方法会有重复的内容。这个时候怎么办呢?
一般情况下,我们会将重复内容抽取出来构造一个新的方法,那么当有方法需要这部分内容的时候,直接调用我们抽取的新方法就行了。
也就是说,这个方法是局限在这个接口类的,专门为着其他方法服务的新方法。即是说这个方法不能被其他类调用,就算调用也是无意义的。那怎么办才能保证安全呢?没错,就是限制其能被访问的范围,就是改变权限修饰符。
而哪一个权限修饰符只能被本类访问呢?
脑海里瞬间想到一个词:private!
这,就是私有方法的由来!