优点:对管理人员,更快和更廉价的开发和维护过程,对建模处理变得更加简单,能生成更加简单、易于维护的的设计方案。 缺点 :学习成本高,设计出优秀的重复性使用的类是具有挑战性的,对初入门面对对象编程的人员是一个痛苦的选择。
第一章作者会来后面来证明面对对象是多么的简单。从思想上解释面对对象程序设计。
汇编是对计算机本体,计算机组织结构的抽象。 BASIC和C等是对汇编的更加抽象,但是并没有屏蔽掉开发人员对计算机组成原理的认识, java在这基础上(c等低级语言)的抽象,我觉得也可以理解成封装,把复杂的东西封装起来,给开发人员调用就行了,不需要他们k 4. 每个对象都拥有其类型 5. 某一特定类型的所有对象都可以接受同样的消息。
面向对象语言,实际上是创建新的数据类型,-- 可以对应到C的结构体。 类描述了相同特性和行为的对象集合,所以类实际上就是一个数据类型,我以前最开始再理解C的结构体的时候就是把结构体理解成一种开发者自定义的数据类型。
向某个对象发送消息就是调用某个对象的方法,
UML的设计
试图开发或者理解程序设计师,最好的方法之一就是将对象想象为“服务提供者”。
代码是的设计可以先从程序提供了什么服务开始思考,设计程序应该有什么类,不同的类分别提供了什么服务等。。。这样还能简化别人使用你的代码的学习成本
用一些权限修饰符,限制某些成员的权限,权限不能给的太大,也不能给的太小。public private protected (还有一种默认的权限) public 》 protected》(default)》private
一个被设计完并测试完的类是可以复用的,代码复用是java中提供的一个了不起的优点之一。 最简单的使用就是:实例化某个提供的类,也可以说成是创建一个对象( 组合 ),其次是可以 继承类 和 实现接口
继承应该是复用代码最常用的方式了,我们不但可以继承父类已有的 数据 和 方法 ,还可以增加和修改父类的方法,但是同时也有弊端,如果你修改了 基类 (也可以称作 父类 , 超类 ),就可以影响被继承的类。
垃圾回收的例子 -- 以垃圾为基类 几何图形的例子 --
导出类继承了基类后,不但复制了基类的数据和方法,更重要的是复制了基类的接口(这里的接口指的是对象的方法),同时可以发送给基类对象的消息也可以发送给导出类 一个圆同时也是一个几何图形,同时体现了 多态性
举例 圆是继承于几何图形的,我们就可以说:一个圆就是一个几何图形。判断继承就要用: is-a 来描述类之间的关系。 一般我们在新的导出类中添加了新的接口,也就是拓展了接口,我们就可以这样来描述基类和导出类的关系: is-like-a ,举例,如果你家的空调(为了制冷)坏了,你去买一个热力泵替换他(热力泵既可以制冷也可以制热),这时候我们就可以说:空调 is-like-a 热力泵
1.7 伴随多态的可互换对象
阐述我对前期绑定(编译阶段决定),和后期绑定(运行阶段决定)的理解 (重点阐述) 因为java本身自动支持了 后期绑定 (在运行阶段确定),所以天然支持 多态
上转型和 下转型
所有的类都是继承于 Object 类,单继承结构是有一定的好处的(代码兼容性) 单继承也使得垃圾回收变得更加容易,-- 可以拓展出去,理解下堆内存和栈内存,和栈数据结构。(堆,栈,堆栈)
说得比较抽象一点可以称作“容器”,再具体一点可以叫做数组或者链表,再具体一点就是 一片内存空间 比如在CPP中就是 STL,java中也有很多满足不同需求的容器,比如:List,Map,Set,其实本质上就是对数据结构中常用结构的封装,或者叫实现。
java中有各种各样的容器,需要我们针对不同的需求和场景选择不同的容器
泛型--在容器中如果不适用泛型,就会有向上转型和向下转型, 在java中所有的类都继承于 Object 类,golang中,所有的结构体都实现了 interface{} 空结构体,这是比较相似的。 但是为什么go不提供泛型呢?可以思考
对于自带垃圾回收的语言,一个好的垃圾回收机制对程序的执行效率来说是非常重要的, 栈上的内存效率远高于堆上的内存,
大多数错误处理的机制的主要问题在于,他们都依赖于程序员的自我警惕性,可以对比go和java的异常处理 异常处理不是面向对象的特征,在面向对象出来之前就已经存在了。
java中本身就内置了异常处理,并强制要求使用,不然编译器就会报错。
在java中的并发编程往往都是通过多线程来解决,在go中往往都是通过多协程来解决。 随之而来的就是对临界资源的竞争问题,然后就会谈到锁。
java Web的发展历史,看看就行了
虽然初学OOP可能比较恼火,但是对于一个设计良好的程序中,面对对象的代码量会更少,理解起来也更容易。