上高中数学时,面对一道难题,首先要解决的问题应该是得出一两个解题思路。程序设计也一样,而且解“题”思路也更灵活多样、思路本身也相对更加繁杂。人脑其实并不太擅长组织一大堆逻辑,不仅如此,复杂的逻辑更不适合阅读。面象对象语言把把小功能单位定位为Object,Object相当于组成生物的细胞,它是一个可复用的、完整的功能单位,你可以不关心它是怎么实现的,仅在乎它为程序提供什么。把Object比作细胸并不准确,但我觉得是合适的。不准确在于Object可以由其它Object、原子数据类型、方法组成。关键在于细胞不能由细胞构成,所以说这个比喻并不准确,但从宏观的角度看,我们并不在乎、甚至不应该在乎Object可以由Object构成这一特性,我们在使用一个对象时,只应当理解它提供了哪些功能,也是所谓的API(Application Programming Interface)。另一方面,把对象比作为细胞还有一个原因:编程设计不但是个脑力活,也是一个细致的体力活,一个程序往往得由成百上千个对象组成,所以,设计时一定要预计一下时间、工作量,编程时一定要有耐心、恒心。搞定一个对象说明离成功近了一步。

  好,现在我把以上的闲话总结、延伸一下:

  ● 分子、原子 -- 原始数据类型 int, float, double ...

  ● 细胞、器官 -- Object

  ● 组生生物体的规律 -- 语法

  ● 生命体 -- 应用程序

  看了以上比较,我相信大家应该已经能够大体揣摩出面象对象语言的设计方式。对于一种应用需求,我们首先应当想到的应该是怎么样设计出各种大的Object,这些Object相当于器官,然后设计出小的Object,相当于细胞。以前学习语言设计的时候分两种设计方式,自底向上与自顶向下,我觉得面象对象语言更适合用向顶向下的设计方式。

  在程序设计中,有一样枯燥的东西是不得不学习的,那是语法。这是程序设计语言里我们不得不遵从的规则、规律。这里只讲跟Object有关的语法规则。

  1、首先从简单的类(同一种对象类型的抽象)的定义开始: class BuitifulLady {}

  2、单继承结构 class BuitifulLady extends Woman {}

  Java中一个类多只能继承另外一个类,Sun设计的出现点是为了让程序结构不过于复杂,但终这个设计还是非常有争议的,包括设计者本人(以前看到过相关的文章),我相信大家在某些时候应该能感觉到这一限制带来的一些不方便。

  另外,继承表示子类将获得父类所有非private的属性及方法包括静态的。private的是不能被继承的,虽然网上有争议,出发点是某某作家(实在不记得是哪位了)的一个笔误,后来自己也澄清了,但还是有好些个人已经被误导了。

  3、实现多个接口 class BuitifulLady extends Woman implements TakeCareable, Voteable{}

  接口是Java中非常灵活、有用的概念,N多的设计模式的实现都依赖于Interface。既然接口被我们如此广泛地使用,那么我们不得不仔细思考一下接口这个东西的设计初衷,设计人设计接口这个东西到底是为了解决哪些问题,提供哪些功能。虽然我看过不少关于接口的定义,不过我想用我自己的看法总结一下。

  接口:具体讲的是一个类向外界保证了自己能提供哪些方法、功能,这是一个方面。另一方面,接口也是一种类、这种类把一些原本不属于同一类型对象的相同功能抽象出来,举个例子:鸡、鸭、狗本身是不同的对象类型,但它们都可以做为宠物,之所以要定义宠物这个概念,是因为这些动物都有让人喜欢这一共性、当然也使商人对它们的买卖更方便。

  因为接口要体现的是对象的“共性”,所以接口中定义的方法功能要尽可能地单一,所以经常的表现是,接口中定义的方法很少,甚至一两个。当然也有多的,但功能一定要一致。否则容易破环“共性”。

  设计模式中讲究”实现依赖于抽象“,这里我很有兴趣谈谈这个。实现很好理解,抽象相对于具体,还是那个例子:鸡、鸭、狗都是具体的,宠物是抽象的,所以,一种做法是在编程时不要直接引用具体的对象,而引用跟功能相关的抽象接口。

  到目前为止,我们已经定义了一个非常典型的一个类:class BuitifulLady extends Woman implements TakeCareable, Voteable{}

  这里我用白话解读一遍:定义一个类BuitifulLady,继承Woman的所有功能,并额外提供保姆、投票能力。Java是这样子简单,但请注意英文语法-s(extends、implements)。