《Thinking in Java》——面向对象:加深理解

16 篇文章 0 订阅

今晚电脑出了点问题,线程池的笔记暂时搁置。

闲着也是闲着,于是看了看刚邮过来的Thinking in java。不得不说,确实是本很棒的书,于是决定写一篇关于面向对象的笔记。

刚看了第一章,最大的感触是从字里行间,每句话中都能有所收获,有所启发。

打个比方,有种和心灵导师面对面交流,“在伴着布谷鸟叫声的湿润森林中沐浴着晨曦第一缕阳光”的感觉。

然而,这个心灵导师就是写这本书的技术大牛。

想起来之前看《大话数据结构》时,里面写到

“希望你们的偶像早日从那些花哨漂亮的年轻男女,变成那些秃顶戴眼镜穿着白大褂的胡子老头。”

我想我快做到了:)


关于面向对象:

1.编程语言经历的发展:

汇编语言——对底层机器的轻微抽象。

   ↓

面向过程语言(命令式)——对汇编语言的抽象。解决问题要基于计算机结构。代价高昂,产生了整个“编程方法”的副产业。

   ↓

面向对象语言——将问题抽象成对象解决问题(“让问题自己解决问题”)


2.五个基本特性:

1.万物皆对象:对象可以被视为“奇特的变量”,可以将任何概念化物件抽象为对象。

2.程序是对象的集合:对象通过接收消息来调用,不同对象通过交换消息构成复杂的程序体系。

3.对象相互包含:可以使用对象创建对象,将程序的复杂性隐藏在对象的简单性背后。

4.每个对象都有一个类型:任何对象都是类(class)的实例(instance)

5.某一特定类型的特定对象都可以接收同样的消息:也就是继承的概念。


3.每个对象都提供服务(可以将对象理解为”提供服务者“),有助于提高对象的内聚性。封装在内的方法可以单独修改,减少耦合。

4.封装对象的其中一个意义是将“类创建者”(开发类的程序员),和“客户端程序员”的工作分开,以便于减少客户端程序员的错误。

为了防止随便访问类的内部,需要增加权限关键字(public,private,protected)

5.复用具体实现:对象之间的“have a”关系(例:汽车有有引擎对象,调用发动方法)

6.继承:

通过抽象出某类事物的共性,将他们共性与特有的功能封装。(如,圆形、正方形、三角形都是几何形,他们共同拥有draw()方法)

便于在程式设计时,将真实存在的具体事物抽象到程序中。

使基类(子类)产生差异:

1.添加新方法(like a)

2.复写方法(is a)举例:房间内有控制空调的借口,当空调坏了换成热力泵时,就相当于添加了制热新方法,但是房间没有控制制热系统的接口,无法都对制热系统进行通信。所以不如“is a“体系严谨。

7.多态:

在将子类向上提升,调用超类的方法时,神奇地发现:会自动根据子类的类型调用相应的方法。

(比如将Cat提升为Animal,再调用move()时输出的是”猫咪:跑“而不是其他的,诸如”麻雀:飞!“)

超类之所以能确定调用哪个方法,是因为面向对象语言的”后期绑定“概念(相对于非面向对象的”前期绑定“),即给对象发送消息,哪段代码被调用要到运行时才能确定,而不是前期绑定概念的,编译器在编译时产生对一个具体函数名称的调用。后期绑定概念中,编译器确定了被调用方法的存在,并对参数和返回值进行类型检查,却不知道具体代码。在Java中,动态绑定是默认行为,不需添加额外uqu键字。

摘抄:这些代码并不是说”如果是Circle,请这样做;如果是Square,请那样做……“。如果编写了那种检查Shape所有实际可能类型的代码,那么这段代码肯定是杂乱不堪的,而且在每次添加了Shape的新类型之后都要去修改这段代码。这里所要表达的意思仅仅是”你是一个Shape,我知道你可以erase()和draw()自己,那么去做吧,但是要注意细节的正确性。“

8.Java采用单根继承结构(Object),加上垃圾回收机制,较C++可以更方便的管理内存。

9.向下转型不安全,添加了参数化类型(泛型)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值