java对象导论
根据java编程思想第四版自己整理的,因为太多所以没办法全部写出来,只挑了对个人感觉有益而且自己以前有不理解的的内容,敬请见谅,如果有什么不对的地方请指导。
一、对象的抽象
Alan Kay第一个成功总结了Java所基于语言之一的Smalltalk的五个基本特性:
- 万物皆对象
- 程序是对象的集合,它们靠发送消息来告诉彼此所要做的
- 每个对象都有自己的由其他对象所构成的存储
- 每个对象都拥有其类型
- 某一特定类型的所有对象都可以接收同样的消息
Booch对对象提出了一个更加简洁的描述:对象具有状态,行为,标识。
二、访问控制
程序开发人员按照角色分为类创建者(那些创建新数据类型的程序员)和客户端程序员(那些在其应用中使用数据类型的类消费者)是大有裨益的。
访问控制存在原因:
- 让客户端程序员无法触及他们不应该触及的部分
- 允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员
所以java有三个关键字在类的内部设定边界:public、private、protected。
- public:对任何人都可以用,也就是任何程序都可以访问。
- private:除类型创建者和类的内部方法之外的任何人都不能访问的元素
- protected:比private多了在继承的类可以访问protected成员,但不能访问private成员
- 包访问权限:没有关键字,当不写上面三个关键字之一的,就是默认的访问权限,类可以访问同一个包(库构件)中的其他类的成员,但是在包之外,就如同private一样
三复用类的实现
这个就涉及到“组合”这个概念:
- 最简单的复用某个类的方式就是直接使用该类的一个对象,此外还可以将那个类的一个对象置于某个新类中
- 新的类可以由任意数量,任意类型的其他对象以任何可以实现新的类中想要的功能的方式所组成
如果组合是动态的,通常被称为“聚合”,经常被视为“has-a”(拥有)关系,就像我们常说的“汽车拥有引擎”一样。
组合带来了极大的灵活性,但是继承不一定具备这样的灵活性,所以在建立新类时,应该首先考虑组合,因为它更加简单灵活,下面初步介绍一下继承。
四、继承初步介绍
关键字:extends
举个例子:几何形为父类,圆形、正方形、三角形为子类;父类有时叫基类,子类叫导出类。
继承有个很重要的方法:覆盖(子类的方法和父类的方法一模一样,只是方法体不一样,就把父类的方法覆盖掉了)。
五,“is-a” 与 “is-like-a”的关系
继承用的就是is-a(是一个)的关系
接口用的就是is-like-a(像一个)的关系
这两个的关系就像接口和继承这两个的关系一样
或许有的人到这会不懂,或许是因为您还不怎么熟悉java,等您熟悉了,看一眼就知道怎么回事了。
正好上面的has-a和is-like-a都出现了,或许大家有个疑问,组合和继承到底怎么选?
问一下自己: 这个类是否会向上转型为父类也就是基类,如果转就继承,不转就组合。
六、OPP语言的容器
好的OPP语言都有一组容器,它们作为开发包的一部分。
Java在其标准库中包含有大量的容器
例如:
- List:用于存储序列
- Map:也称之为关联数组,用于建立对象之间的关联
- Set:每种对象类型只有一个
- 以及诸如队列,树,堆栈等其他构件
从设计的观点出发,真正需要的是一个单一的那个解决问题的序列,如果单一容器能解决所有的需求,就没必要设计不同的种类的序列了,然而还是需要对容器有所选择,原因:
- 不同的容器提供了不同类型的接口和外部行为
- 不同的容器对于某些操作会有不同的效率
现在举个例子,来说明上述原因:
ArrayList和LinkedList,它们都具有相同的接口和外部行为的简单的序列。但是在ArrayList中,随机访问元素是花费固定时间的操作,对于LinkedList来说,随机选取元素需要在列表中移动,这种代价是十分高昂的,越靠近尾部,花费越高。但是想在序列中插入一个元素,LinkedList的开销却比ArrayList小的多。
这一章的总结个人感觉挺不错的:
OPP和java或许并不是适合所有人,重要的是要评估自己的需求,并决定java是否能够最好的满足这些需求,还是使用其他编程系统(包括你正在使用的)才是最好的选择…即使最终仍旧选择java作为编程语言,至少也要理解还有哪些语言选项可以选择,并对为什么选择这个方向要有清楚的认识