Java编程思想:第9章 接口

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。

9.1抽象类和抽象方法

如果我们的基类只是希望它被继承从而通过它的接口操作导出类,它本身创建对象没有什么意义,那么我们可以把这个基类设计为抽象类。把在基类中不好实现的方法标记为abstract。这样做可以使类的抽象性更加明确。

9.2接口

interface关键字使得抽象概念更加彻底,只提供了形式,没有任何实现。但它不仅仅是极度抽象的类,它还允许创建出一个可以向上转型成多种类型的类,来实现类似于多重继承的特性。

接口中也可以包含域,但这些域是隐式static final的。

接口中的方法必须是public(可省略不写),实现类中实现方法也必须是public的。

9.3完全解耦

只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。如果这个方法还想操作其他类型,就会发生错误。而接口就可大大放宽这种限制,使得我们可以编写复用性高的代码。例如:有一个手机类,接口是播放器play(),有不同的导出类继承这个手机类,一个方法接收手机对象,调用play方法播放音乐。但是这个方法只能接收手机对象和导出类对象。如果我想让电脑播放音乐,由于电脑不属于手机继承体系,所以不能实现这种功能。但是如果我们把播放功能抽象到一个接口里,让手机实现这个接口,电脑实现这个接口,那么这个方法只要接收接口参数即可。实现了解耦合。

如果手机类是我们创建的,我们可以直接添加implements,但是如果它是jar里的或者别人的,我们不能直接修改它怎么办呢?

可以使用适配器模式,创建一个适配器类,实现接口,组合所需要的对象,在方法里调用该对象相应的方法。

9.4Java中的多重继承

一定要记住:使用接口的核心原因就是为了能向上转型成多个基类(以及由此带来的灵活性),第二个原因就是与使用抽象类相同:防止客户端创建该类的对象。

9.5通过继承扩展接口

利用extends关键字可以扩展接口里的方法

9.6适配接口

使用适配器模式来给现有操作接口方法添加新的操作对象是非常有用的。

9.7接口中的域

隐式的static、final的,在enum出现之前(Java SE5)用它当做常量。

9.8嵌套接口

...

9.9接口与工厂

接口是实现多继承的途径,而生成遵循接口对象的典型方式就是工厂方法设计模式。

原始方式:

方法以接口为参数,void action(Service s){...}

调用的时候if(xxx)action(new SImp1());else if(xxx)action(new SImp2());else if....每个调用地方都需要直接提供实现类对象。如果需要修改/增加实现类代码就会很冗余。

工厂方式:

void action(ServiceFactory fac){Service s = fac.getService();....}

只需要在factory里改变即可。

9.10总结

任何抽象性都应该是应真正需求而产生的。应该优先选择类而不是接口。如果接口的必需性变得非常明确,那么就进行重构。接口是重要的工具,但是不要滥用它。

时间: 2024-10-27 11:46:24

Java编程思想:第9章 接口的相关文章

java编程思想笔记(第一章)

Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5.某一特定类型的所有对象都可以接收同样的消息. Booch提出一种更简洁的描述: 对象拥有状态(state) 行为(behavior) 和标识(identity) 每个对象都有一个接口 每个对象都属于定义了特性和行为的某个类(特性可以理解为属性的状态,行为可以理解为method) 在面向对象的程序设

Java编程思想——第17章 容器深入研究(two)

六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add 在尾部增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementExce

Java编程思想笔记(第二章)

第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(reference)操作对象 类似遥控器(引用)来操作电视(对象) 在Java中你可以创建一个引用,但是没有与任何对象关联,比如: String s; 这个时候如果用则会报错.安全的做法是: 创建一个引用的同时并进行初始化 String s="1111"; 必须由你创建所有对象 New关键字的意思是给我一

Java 编程思想 第五章 ----初始化与清理(1)

从今天开始每天一小时的java 编程思想的阅读和编码,其实就是把书上的代码抄下来. 5.5 清理:终结处理和垃圾回收 初始化和清理工作同等重要,但是清理工作却被常常忘记,但是在使用对象之后,对对象弃之不顾的做法并不是很安全.Java有自己的垃圾回收器负责回收无用的对象占据的内存资源.但也有特殊情况:假定你的内存区域不是用new获得的,这是无法用垃圾回收器释放所以java中允许在类中定义一个名为 finalize()的方法.       工作原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首

java 编程思想 一 第二章(对象)

上班之余发现有很多空闲时间,享受生活 又觉得有点空虚,而且对自己的基础知识总觉得掌握的不是很牢固,有点似懂非懂的感觉,近来刚好有时间,所以就考虑继续学习,然后再经过考虑和各大博主推荐选择了<java编程思想>这本书,在此分享学习心得跟大家共勉,也算是对自己的监督吧.(本内容需要有一定的基础才能看,类似于基础回顾,强化理解,新手可能有些地方不太能听懂) 一.什么是对象? 这并不是我们男女朋友那种对象哈哈. 简言之:万事万物皆对象. 个人理解:我们所要处理的事务或者建立的某种模型的抽象总结.具体就

Java编程思想(第十一章持有对象)

1. 第11章 持有对象 java通过使用容器类来储存对象,与普通数组不同的是,普通数组的长度不可变. 1.1. 泛型与类型安全的容器 使用预定义的泛型,它指定了这个容器实例可以保存的类型,通过使用泛型,就可以在编译器防止将错误类型的对象放置到容器中. public class gerbil { private int gerbilNumber; public gerbil(int gerbilNumber){ this.gerbilNumber = gerbilNumber; } public

Java编程思想 第21章 并发

这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_time 2013-12-18 * @use 测试基本的两种线程的实现方式 *         测试中断 */ public class BasicThreadTest { public static void main(String[] args) { Counter c1 = new Counter(

看java编程思想 前两章 总结

重点词是: 对象. java 是一个面向对象编程的过程,在java中万物都是对象,为什么要这么设计呢? oop面向对象编程:对于管理人员 这是一个更快的更廉价的开发和维护的过程:对设计人员则是建模简单思路清晰,让我们思考对象的时候需要形象的思维去. 对象是一种抽象的描述,也可以说在java中一切都是对象.其实操作对象的仅仅是他的引用,用new不是创建对象,而是创建对象的引用,当在一个作用域里面用new创建对象,引用的作用区域就是那个花括号,但是引用指向的类型对象仍然存在内存空间中,但是java用

java编程思想--第三章 操作符

额...继续搞些容易忽略的东西在下面,这章没打算精读,赶紧过,好戏应该在后面. 1.基本类型的赋值 比如 : int a =1; int b = a; 是进行值的复制,以后改变了a的值对b没有影响 引用类型的复制 比如: List<String> list1 = new  ArrayList<String>(); List<String> list2 = list1; 是进行的引用的复制,list1与list2 会同时指向 那个 ArrayList ,一个改变了它的状态