我的理解就是面向对象编程就是通过对现实世界中的对象或者物体进行抽象得到它的特征和行为。
(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type )的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是 OOP 最重要的概念之一。
通过new运算符创建一个类型的对象,然后将这个对象赋值给这个类型的一个句柄。而后由这个句柄通过”.”运算符和消息名称(即类型的方法名)对应起来。
防止程序员接触不该接触的东西;允许库设计人员修改内部结构
就是通过访问权限控制符来控制外部对成员的访问。
public:后续的定义任何人均可使用。
private:除您自己,类型的创建者以及那个类型的内部成员函数外其他任何人都不能使用后续的定义。
protected:与private相似,只是继承的类可访问受保护的成员,但不能访问私有成员。
未指明关键字则默认为friendly,友好的。之能在包装的范围内使用。
在创建并测试好一个类后,它应该成为一个有用的代码单元。其实方案的重复使用包括两个方面:一个是继承,另一个就是组合。但是继承不是随处可见的,继承的灵活性不足,而组合可以保证灵活性,通常组合的成员对象是private控制的。所以新建类的时候使用组合将更加简单灵活。
当我们要新建一类时,但已经有一个类功能和我们要新建的大致相同,我们可采用继承方式避免写重复的代码。这时子类和父类具有相同的类型。
Java采用两种方法区分衍生类和基础类:
为衍生类添加新的函数。
在衍生类中改变基础类的函数的行为。
继承自同一个基础类的多个衍生类的对象作为上转型对象可调用基础类的一个函数。函数执行时会自动判断类型是什么,而不用我们写代码去判断。在面向对象程序设计时,采用上溯造型的方法,避免查询准确类型。
将一条消息发给对象时,如果并不知道对方的具体类型是什么,但采取的行动同样是正确的,这种情况就叫作“多形性”(Polymorphism)。对面向对象的程序设计语言来说,它们用以实现多形性的方法叫作“动态绑定”。编译器和运行期系统会负责对所有细节的控制;我们只需知道会发生什么事情,而且更重要的是如何利用它帮助自己设计程序。
1.6.2 抽象的基础类和接口
用abstract关键字修饰的类即为抽象类,不能创建抽象类的对象。这样做的目的就是只为上溯造型成它,以便使用它们的接口。
用abstract关键字修饰一个尚未实现的方法,作为一个根的作用,所有继承这个类的子类都必须实现这个方法,不然子类也为抽象类。
interface关键字完全禁止了所有函数定义。
对象可被创建于两个地方,堆栈和内存池中。
存放在堆栈时需知道对象的数量,存在时间以及类型。虽然获取了较快的执行速度,但牺牲了灵活性。
存放在内存池中除非进入运行期,就真不知道对象的数量存在时间,准确的类型。
Java采用垃圾收集器将不用的对象清除。
1.7.1 集合与继承器
最后,记住集合只是一个用来放置对象的储藏所。如果那个储藏所能满足我们的所有需要,就完全没必要关心它具体是如何实现的(这是大多数类型对象的一个基本概念)。如果在一个编程环境中工作,它由于其他因素(比如在 Windows 下运行,或者由垃圾收集器带来了开销)产生了内在的开销,那么矢量和链接列表之间在系统开销上的差异就或许不是一个大问题。我们可能只需要一种类型的序列。甚至可以想象有一个“完美”的集合抽象,它能根据自己的使用方式自动改变基层的实现方式。
1.7.2 单根结构
Java中的所有类的基础类都是Object类。
一个单根结构加上所有对象都在内存堆中创建可以极大简化参数传递。利用单根结构可以很方便的实现垃圾收集器。
通过多线程使程序运行更快。多个线程共享资源时,同一时间只能有一个线程使用特定的内存空间为达到这个目的,需要使用 synchronized 关键字。