× 我们能解决何种复杂程度的问题,取决于对这个问题所做的抽象的种类和复杂程度。
× OOP的五种特征:
1、 待解决的问题都可以看作程序中的对象,对象存储数据,还可以让你提要求命令它做某些操作。
2、 程序由一些对象组成,它们之间互相传递消息,告诉对方干什么。
3、 已有的对象组合起来能成为一个新的对象。
4、 任何一个对象都是某个类的实例。区别不同的类,可以看一个类的接口。
5、 所有属于同一类型的对象都能接受同样的消息。这是OOP最强大的功能之一。
× 理解对象的最佳方式是:把每一个对象都看作服务的提供者。
× 提高对象的内聚性(cohesion):每个对象都应该只做一件事,并且做好一件事,而不是做太多的事。
× 隐藏实现的重要性:
1、 禁止程序员去碰那些对象内部运作所需的东西,只能去碰对象的接口。
2、 允许类库的设计者在不告诉程序员的情况下,修改类的内部工作方式。
继承类能够访问protected成员。
同属一个包中的类能访问包中其他类的friendly成员。
× 代码复用是OOP最主要的优点之一,你可以用你已有的类合成(composition)新的类。
× 继承(inheritance)是为了表达类与类之间的相似性。
基类保存的是所有继承自它的类的共有特征和行为,创建基类是为了表达你对系统中的某个核心思想的理解。
派生类是为了表达各种表达这个核心思想的方式。
× 继承时的两种不同情况:
1、派生类只覆写(override)基类中的方法。这样,派生类和基类的接口完全相同,可以用派生类的对象直接替换基类的对象,这称为“完全替换”(pure substitution)。这种派生类与基类的关系称为(is-a)关系。
2、在派生类中加入一些新的接口元素(即:方法),派生类的接口得到了扩展。这样,基类还是可以被派生类所替代,但是,派生类中加入的新的方法无法通过基类的接口访问。这种派生类与基类的关系称为(is-like-a)关系。
× 多态性是OOP的最主要的特征。
编译系统实现多态性时,编译器不用传统的方式进行函数调用,而是使用了OOP语言中的“后绑定”(late binding)的概念。当向某个对象发送了一个消息时,不到运行时,编译器不能确定调用哪些代码,编译器只保证要调用的方法的存在与调用方式的正确(检查方法的参数和返回值的匹配)。
将派生类当作它的基类来使用过程叫做“上传”(upcast),当向已经上传的对象发送消息时,这个对象仍然会作出正确的反应(调用自己的已经覆写过的方法)。
× abstract方法只能存在于abstract类中。abstract方法是为了表达这样一种意思:由这个类派生出来的类都有这个方法,但它的实现不在基类这里。
× Interface是对abstract类的在概念上的深化,它将类的接口与类的实现彻底的分开。另外,类还可以实现多个接口。
× java只使用“堆”来创建对象,由垃圾回收器来在适当的时间释放对象所占的内存空间。
× java采用单根的继承体系,最终的基类为Object。这样的好处之一,就是很容易让每个对象能被垃圾回收器回收。
× java通过对象序列化(object serialization)或者JDO来提供轻量级persistence支持。
“轻量级”的含义是:在存储和提取的过程中,还必须写代码进行明确的调用。
× 浏览器就是一个小型的操作系统。
× 插件集成到浏览器中,告诉浏览器“从今往后,你可以进行这些新的工作了。”
× 应尽量使用脚本语言完成浏览器客户端的编程,之后再考虑使用更复杂的插件。
× Java applet的源码不会出现在客户端,比脚本语言安全一些。
× Java applet比ActiveX控件更安全一些。Java applet只能在“沙箱”中运行,Web浏览器中的Java解释器会在装载applet时查出所有不合格的指令。更重要的是,Java applet既不嫩能往硬盘上写文件,也不能删除文件。