你的位置:首页 > Java教程

[Java教程]java编程思想读书笔记一


  工作也有一年了,还没读过圣经这不是惹人笑吗,上周终于把这本书买回来了,这两天才开始看,一边看呢一遍记一下笔记,用了一些自认为幽默的话来写的,一方面自己写的也是津津有味,另外呢也希望能够给读者带来会心一笑的感觉,文中所述仅仅是本人拙见,如有不正确的地方欢迎大家指正,楼主会认真修改的。下面开始:

  

1.抽象过程  

  书中开篇就写到每种编程语言都提供抽象机制,接下来就介绍了两种抽象的机制,但是我没接触过里面的语言所以也不再赘述,面向对象语言的抽象机制就是抽象出对象,那么什么是对象?对象可以看做是一台计算机,有自己的状态,还有自己的操作,用户可以要求对象执行这些操作。例如我桌子上的可乐瓶子,容量是600ML,容量就是这个瓶子的属性也就是状态,可以装可乐就是它的方法也就是操作,可乐瓶子可以执行装可乐的操作,当然需要发送消息,也就是调用方法。

  面向对象语言的五个基本特性:
万事万物皆为对象

  书中的说法是对象可以看做是一种奇特的能量,可以存储数据,同时也可以要求他在自身上执行操作。我的理解是这样的一件事情或者是一个事物,拥有自己的属性,并且具有一些行为,那么就可以称之为对象,

可乐瓶子有容量,可以装可乐,那么它就是一个对象(原谅一个喜欢喝可乐的人的思维),显示屏有大小,可以显示图形图像,那么它也是一个对象,一个原子,有自己的原子核,可以组成分子,那么原子也是一个对象。。。。。。

程序是对象的集合,他们通过发送消息告诉彼此所要做的

  所谓的消息也就是对某个对象的某个方法的调用请求,如果把你打电话简单看成一个程序,那么你和电话就是这个程序中的两个对象,你要打电话就要告诉电话说我要打电话,但是电话不是人也不是神,他听不懂你说的话,那么你需要做的就是在键盘上按下电话号码然后按下呼叫键,也就是说此时你作为一个对象调用了电话这个对象的打电话的方法,说得简单一点就是程序是需要程序中所包含的对象根据需要互相调用彼此所拥有的方法来执行的。

每个对象都有自己的由其他对象所构成的存储

  其实这条我不是太理解,按照书中的说法是可以创建现有对象包的形式来创建新的对象,这是可以理解的,就像一个人是对象,一群人也可以看做一个对象,但是我不理解的是什么呢?但是假如这个对象是一个人,这个人有身高有体重,可以走路可以说话,但是怎么包含由其他对象所构成的存储呢?是不是可以这样理解呢?这个人要穿衣服,衣服也可以看做是一个对象,那么这个人对象就包含了由衣服对象所构成的存储呢?还请大神们解惑。

每个对象都有其类型

  这也是必然的,一个老人是一个人,一个孩子也是一个人,他们的类型都是人,但是你能说一条美人鱼是人吗?不能,你只能说美人鱼是一条鱼,因为它的类型就是鱼。

某一个特定类型的所有对象都可以接收同样的消息

  这个很好理解,就是只要这个对象的类型是人,不管是男人女人亦或者老人孩子,只要是人,都可以走路都可以说话(当然我说的是一般情况,如果你非要较真的说这人没腿或者这人是哑巴,那我也没办法),也就是说这些类型是人的对象都可以调用走路说话的方法。 

  Booch对对象提出的描述是:对象具有状态、行为和标识。对象的状态是什么呢?就是对象自身的属性,例如可乐瓶子的容量,行为是对象所拥有的方法,书中对标识的定义是每一个对象在内存中都有一个唯一的地址,但是我认为标识是用来区分对象的,但是并不需要仅仅从存储地址上来区分,可以先从对象的类型上来区分,一个孩子对象肯定不能和一个可乐对象相同吧,但是如果是一个孩子对象和一个老人对象就不能仅仅从类型上区分了,因为这两者的类型都是人,这时候就需要从存储地址上来区分了。

2.每个对象都有一个接口

  文中在讲解对象的接口之前首先给出了类的定义,什么是类呢?类也即类型或者数据类型,是具有相同特性和行为的对象的集合,或者反过来说每个对象都是唯一的,但是同时也是具有相同特性和行为的对象所归属的类的一部分,用关键字class来表示类。创建类以后,就可以根据这个类创建无数个基于此类的对象,就像你创建了一个可乐类,那么你可以创建百事可乐对象、可口可乐对象(原谅我想不出来还有别的可乐),然后你就可以去操作你所创建的可乐对象,但是如何才能获得有用的对象呢?或者说是怎么让可乐对象只装可乐而不去装爽歪歪呢?也就是需要某个对象只满足某些请求,这些请求是由对象的接口来定义的,决定接口的就是我们所定义的类或者说是类型。什么意思呢?还是可乐的例子:现在我们定义了一个可乐类叫KeLe,类中有一个方法叫zhuang(),然后KeLe baishi = new KeLe() baishi.zhuang(),我们使用new创建了baishi对象,这个对象可以去调用zhuang方法,但是我们要明白一点,这个zhuang()方法能用来装白开水吗?能用来装哇哈哈吗?不能,只能用来装可乐,为什么?因为baishi对象是基于KeLe类创建的,这个类是可乐类,所以他的方法也只能是装可乐而不是别的,这进一步说明了书中所说的接口是由类型决定的。另外书中说道了接口确定了某一特定对象所能发出的请求,这个也好理解,就像上面说的你能用baishi对象去发出装水的请求吗?或者你能用张三的电话号码去打通李四的电话吗?也就是说接口用来限制对象能够做什么事情,这和类以及类中的方法息息相关。

 

3.每个对象都提供服务

  关于这点的理解,这个还是以可乐为例子,可乐是拿来干嘛的?这不是废话吗,可乐是拿来喝的,但是可乐为什么喝了那么刺激那么爽?那就要关心可乐的配料了,什么糖啊水啊染色剂啊等等,正是这些配料一起成就了可乐,这和程序是一样的,程序是拿来为用户服务的,但是它需要调用其他对象的服务才能实现这一母的,就像正确的配料才能配出来可乐一样,合适的对象才能成就完美的程序,因此作为编程人员的你就需要去创建或者说去寻找这些合适或者说是能提供理想服务来解决问题的一系列对象,将你需要解决的问题或者说编写的程序分解成一系列对象的组合。同时书中还说道把对象看做服务提供者的一些好处,什么好处呢?提高对象的内聚性,高内聚是软件设计的基本质量要求之一:这意味着一个软件构件各方面组合的很好。这个怎么理解呢?还是可乐,大家都知道糖是提供可乐中的甜味的,水是稀释糖让可乐保持液体的(以上纯属虚构,如有雷同,去找可口可乐公司),但是现在如果说我不加水了,我就熬个糖稀加进去,这可乐是不是喝的更够味啊?我想说,哥啊,那还能喝吗?这例子什么意思呢?意思就是说每种东西完成一个任务就行了,别做的太多,做多了人家未必领你的情,你是糖就安安静静的提供你的甜味,去搞什么稀释?那是人水的职责。对于编程一样,一个对象提供单一的职责就够了,不需要去负担更多的职责,不然小肩膀扛不住不说还搅坏了一锅粥,对谁都没好处,这也就是我们常说的单一职责问题,如果你的对象提供了有用的服务并且按照单一职责设计,那么在别人试图理解你的代码或者说复用你的代码时都会变得更加简单容易。

4.被隐藏的具体实现

  书中将开发人员按照角色分成了两种,一种是新的数据类型的创建者称之为类创建者,一种是使用数据类型的类消费者称之为客户端程序猿,那被隐藏的具体实现是什么意思呢?意思就是类创建者创建了一个新的类,但是只是给客户端程序员提供了接口并没有告诉客户端程序员我这个类的具体实现,这也是我们经常提到的面向接口编程,就是我只告诉你我这个类可以做什么,但是怎么做我不告诉你?就像我现在发明了一种新型的可乐,我就告诉你有糖有水就可以生产纯天然绿色无公害的可乐,但是水是不是要加热,糖是不是要冰镇我就是不告诉你,你管我怎么做?反正你提供水和糖我给你可乐就是了,管那么多干嘛?编程也是如此,我就提供一个接口,你只要提供接口所需要的参数,我的接口就会给你返回你需要的数据,至于怎么实现的跟你没关系啊。

  这么做有什么好处呢?其一,避免客户端程序猿修改本不该修改的地方,我的算法就是这样,只有这么算才能得到结果,如果可以让别人修改我的实现,得到了不一样的结果,这锅谁来背?反正我是不背,把需要隐藏的部分或者说是实现中比较脆弱的部分隐藏起来,不让调用的人随便改,那么就不会出现这种情况了。其二,你对隐藏部分的修改不会影响调用者,如果你提供的不是接口而是实现类给调用者,人家也没改你的实现方式,正常的调用,而且你这类还比较重要,人家一下用了几千个地方,你回头一看,不对啊,这个地方我得改改,得,你是改爽了,等调用的人测试程序的时候瞬间爆炸完成千杀,你说调用的人会不会提着刀正在赶往你家?如果你将接口和实现分开,你的实现如何改对人家调用的人都没有影响,人家也不会没事拿刀看你是吧?

  关于修饰符范围的问题我就不在这多说了,大家也都知道的,本来废话就多了,再说废话就更多了。

5.复用具体实现

  代码复用相信大家都知道,比如我们通常会在工具类中写一个日期转换方法,使用的时候直接调用这个方法即可,当然这是方法的复用,书中所说的复用是类的复用,什么是类的复用呢?还拿可乐说是,现在有两家饭都卖可乐,一家卖百事可乐,一家卖可口可乐,这时候如果让你创建类,你是创建一个可乐类好呢还是为这两种可乐分别创建一个类呢?这不是废话吗,以我编程多年的经验怎么不知道是创建一个可乐类,再分别创建百事可乐对象以及可口可乐对象就可以了,对,这就是最简单的类的复用方式-直接使用类的一个对象,也就是说使用类的对象来达到复用类的目的,此为其一。

  那么第二点是什么呢?还是先说可乐,其中一家老板觉得单卖可乐不挣钱啊,怎么办啊?改卖套餐了,套餐有啥?鲜香鸡腿、精品小菜外加可乐一(小)杯,这时候怎么搞?你要新建一个套餐类,类里面属性是鸡腿的大小,鸡腿的颜色,可乐的大小,可乐的种类。。。。。。来个大杂烩吗?你这个大杂烩的类管的事情是不是太多了,不符合我们所说的单一职责原则啊,怎么办?凉拌,这时候就需要用到复用的第二种方式--将类的某个对象置于某个新的类中,这时候你可以先创建一个可乐对象,然后只需要用套餐类包含可乐对象就可以了,我管你是百事还是可口的我只需要知道我里面需要有个可乐就行了,至于可乐的属性那就交给可乐类去维护就行了,我不需要知道,同样其他的鸡腿啊小菜啊都是如此,这样做的结果是套餐类只需要知道我里面有什么,至于各自的属性让各自的类去维护好了,这样是不是就不违背单一职责原则了呢?

  由任意数量的任意对象以任意可以实现新的类中想要的功能的方式组成新类的方式称之为组合,如果组合是动态发生的,那么也称之为聚合(关于组合和聚合的区别大家可以自行百度),组合被视为“has-a”关系,也就是拥有关系,就像人拥有手脚一样,至于组合和继承的关系下一节再说吧。

6.继承

  这会儿在地铁上,用手机来码字说一下继承,书没在身边,但愿不会说错。首先来说一下为什么会出现继承?前面说到万事万物皆为对象,每一个对象又是某一个类的一个实例,那么现在还是可乐的例子,我们都知道有百事可乐和可口可乐,那么好了,我们现在可以创建两个类,分别是百事可乐类BaiShiClass和可口可乐类KeKouClass,这两个类里面都有两个属性,分别是价格、容量,这样没问题吧,但是我们得知道两个问题,第一,不管是百事可乐还是可口可乐,这两者都是可乐;第二,现在的可乐种类只有两种。如果现在出现了第三种第四种乃至第N中可乐,那么是不是我们要为每一种可乐都创建一个类,并且在各自的类里面写上价格和容量这两种属性呢?大家可以想一下,这样做是错的吗?不是,这样做是无可厚非的,但是这样做又是麻烦的,对于我们这些害怕麻烦的程序猿来说,麻烦就意味着你要加班,那么怎么搞?聪明的java设计者给我们搞了一个继承(以上单纯是为了引出继承的YY,具体继承的出现请自行度娘),继承怎么做呢?很简单,创建一个KeLe类作为父类(基类),然后让具体的可乐类去继承我们创建的父类,继承以后子类自动具有了父类的属性和行为,什么意思呢?就是说你管你老爹叫皇阿玛,你老爹退位了,你当上皇帝了,以前管你老爹叫皇上的人现在得管你叫皇上,以前你老爹穿的龙袍现在归你穿了,就是这个意思。只要子类继承了父类,那么子类就拥有父类的一切。这时候有人会有这样的疑问,就像你说的,如果你的百事可乐继承了可乐,同时你的可口可乐也继承了可乐,那这两者不是都混为一谈了吗,你这是强行合并了百事可乐公司跟可口可乐公司啊,然也非也,何以为然呢?何以为非呢?且听我细细道来,子类继承了父类,拥有父类的一切属性和方法,但是子类也可以拥有自己的属性和自己的方法,如果子类没有自己的属性或者方法,那么这是最基本的继承,子类与父类的关系是"is-a",可以简单的说子类就是父类,你能说百事可乐不是可乐吗?你能说可口可乐不是可乐吗?但是如果子类在继承父类的用时还拥有自己的属性和方法,那么子类和父类之间就是"is-like-a"的关系,子类像是父类,但是和父类又不完全相同,这个也很好理解,唐高祖李渊是皇帝,他的儿子唐太宗李世民也是皇帝,太宗继承了高祖的皇位,两者相同点是什么呢?相同点是都是皇帝,同时不同点也很明显啊,所以只能说两人相似,但是你能说这是一个皇帝吗?还有一点,子类继承了父类的方法和属性,但是子类对于继承而来的方法也是有重写的权利的,什么意思?举个简单的例子,你老爹吃饭喜欢吃饭面条,但是你吃饭喜欢吃米饭,同样是吃饭,但是你们俩吃的东西不一样,或者说一个喜欢用锅吃,一个喜欢用盆吃,这不也是吗?所以说,子类可以拥有父类的方法,但是对于方法是可以重写的,不一定要墨守成规。

  今天暂时就写到这里了,有说的不对欢迎大家指正,楼主会继续努力的。