thinking in java 学习笔记 9 接口
第九章 接口
?
不可否认,我们开始了难啃的骨头的一部分,对于接口,其实也就是那些东西而已,没什么问题,弄一下就熟了
?
好,废话不多说,开始吧
?
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法
?
其实这种机制在编程语言中不通用,c++只是间接支持,不过在java中,他们是非常重要的思想
?
.抽象类与抽象方法
抽象类其实它是普通类与接口之间一种中庸之道,在使用时,可能一开始你就想用接口,但是事实是,抽象类很重要且必须.创建抽象类希望可以通过这个通用的接口操纵一系列的类.
?
包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的abstract(否则,编译器会报错);抽象类的所有方法不一定都是抽象的
?
1.若要创建一个抽象类的对象,必须实现其里面所有的抽象方法,抽象方法默认且只能是public
?
2.若继承了抽象类,必须重写其所有的抽象方法,否则报错,除非你定义子类也为抽象类
?
抽象类对重构也是很有好处的,在我学习android的过程中,有许多框架里面的类就是抽象类
?
?
?
?
.接口
interface产生一个完全抽象的类,它根本就没有提供任何的实现,至少提供了形式,“一个接口表示:所有实现了该特定接口的类看起来都像这样” ? ,很多时候它弥补了java单继承的不足
接口可以包含域,但是这些域都是隐式的static和final,这些代表着不能改变其值
?
当实现该接口时,必须重写其所有方法,注意接口之间是可以继承的,但是不可以实现,接口的继承也用extented,而且不需要重写方法也可以
?
接口所有的方法或者变量什么的,默认是public,对于接口有两种访问权限,public和包权限,不写就是包权限
?
?
.完全解耦
?
这里介绍了一个设计模式,。还真多啊,我这里大概讲一下
?
创建一个能够根据所以传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式,,这类方法包含所要执行的算法中固定不变的部分,而策略包含变化的步伐,策略就是传进去的参数对象,这个模式和状态模式比较像,在我的模式文章里面详细介绍
?
?
例子(这个不是策略模式的例子,是说完全解耦的)
第一种情况,我本来有一个基类,叫做汽车基类,方法有开空调,开灯什么的,然后有许多小子类继承汽车基类
那么就有奔驰啊,宝马什么的,然后测试类(也就是有main方法的那个类),是人类,有开这个方法
接受的参数是汽车类(子类会向上转型)
那么这个人就可以开车咯,
?
本来这一切都很好的,但是这有时候,突然有飞机要这个人开,但是这个人他的开方法只能接受汽车啊
那怎么办,哎,那就开不了飞机了,这就是耦合度很高
?
所以解决办法就是因为飞机基类和汽车基类有相同的接口(也就是相同的方法),所以我们只需要定义一个接口,然后把这些方法放进去,然后子类实现这个接口,什么奔驰,波音,直升机什么的,然后在这个人的开方法传入的是接口
那么自然他什么都能开了,因为其他子类实现了这个接口,就能向上转型啦
?
第二种情况,针对第一种情况,我们是基于我们有权利修改汽车基类的代码,但是假如我们没有权利怎么办,这种情况经常发生,我们只是用别人的接口,。如果别人写的很烂,那怎么办,这时候就可以使用适配器模式,草,有一个模式,在适配器模式中将接受你拥有的接口,并产生你需要的接口...还是那句话,具体请看我的模式文章
?
?
?
.多重继承
可以使用接口达到多重继承这种效果,使用接口的好处在于灵活的向上转型(我还记得之前说过判别是非用继承,就问问自己是否需要向上转型),看来向上转型的确是非常重要的一个point,另外一个好处就在于,对这个类的使用者不必一点要基于这个类进行开发,降低了依赖性
书上179页的那个例子挺特别,继承抽象类实现了接口的fight方法.
?
.组合接口时的名字冲突
不要在不同的接口与抽象类中使用相同的方法签名,或者相同的方法名,否则你会被他们的覆盖,实现,重载搞死的
?
?
.适配接口
就是使用策略模式和适配器模式进行接口的适配,很强大,具体可以看看我的模式篇
?
注:在java5以前,定义常量很多时候都是在接口域里面定义的,因为是static和final,当然啦,现在有了enum
?
接口的域的值存储在该接口的静态存储区域内,,接口还可以嵌套在接口和类中,作用暂时没发现
?
?
.接口与工厂
这是关于创建框架的,
是这样的,以游戏系统为例子
有两个接口,一个是游戏接口,一个是工厂接口
国际象棋类实现了游戏接口,跳起实现了游戏接口,国际象棋工厂实现了工厂接口(核心方法是创建国际象棋对象)
跳起工厂实现了工厂接口(核心方法是创建了跳起对象),然后在测试类里面调用工厂,传入不同的工厂类,就能构造不同的工厂,这个就是工厂模式(不是简单工厂模式哦),好处就是在添加一种新产品时,不用重复写他的逻辑,更抽象,耦合度更低了,下一章会介绍更加优雅的工厂模式
?
?
?
总结:接口很好用,也很强大,作用无非也就是高内聚,低耦合原则,但是我们不要盲目去使用接口,更多时候我们的原则应该是优先选择类
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
注:java之测试junit ? ? ? ? ? ? ?http://wenku.baidu.com/view/a48a8168a98271fe910ef984.html?from=rec&pos=1&weight=19&lastweight=15&count=5
?
10款常用Java测试工具