计算机革命起源于机器,编程语言的产生也始于对机器的模仿
但随着发展机器越来越像人脑的一部分,于是编程语言也不断发展,在不断经历抽象过程后,更类似人类所认知的方式 。 面向对象编程便是其中的一种重要实现思想
1.1 抽象过程
所有的编程语言都提供抽象机制,抽象是指我们使用语言映射或描述什么,比如汇编语言是对底层机器的轻微抽象(用命令语言来描述机器控制机器),命令语言 c basic则是对 汇编语言的抽象 实际上这些语言依然是在基于计算机结构来解决遇到的问题 其实是在使用计算机模型来解决生活中的业务问题 难以理解,开发与维护
oop(object orientd programming) 面向对象编程是一种更为有力的抽象 它为程序猿提供了 业务空间中的元素(对象)工具,程序猿可以依据业务空间,来添加新的元素(对象)以使程序可以解决业务问题。更加具有灵活性,更易理解。 它根据问题 来 描述问题,而不是依据解决方案的计算机来描述问题。
面向对象语言的五个标准(重要)
1.万物接对象 将对象视为变量 具有存储数据的能力 同时也拥有自身行为 ,事实上你所能想到的物品都可以抽象(描述)为程序中的对象
2.程序是对象的集合,他们通过发送信息来告知彼此所要做的事
3.每个对象都有其他对象作为存储的元素(对象属性可以是对象)
4.每个对象都拥有其类型 每个对象都是某个类的实例
5.某一特定类型的所有对象都可以接收同样的消息(多态) 圆形 与 方形 都属于 几何图形(类) 他们具有一些相同的行为 可以接收同样的信息执行行为 : 圆形.acreage() 方形.acreage( ) 返回面积
对象:对象具有状态,行为与标识 每个对象都具有内部数据与方法行为,并且每个对象在内存中对应的地址不同
1.2 每个对象都有一个接口
所有对象都是唯一的 ,但是他们又具有相同的特性行为 比如 鸟类
类描述了具有相同特性(数据元素)与行为(功能)的对象集合,所以一个类实际上是一个数据类型,例如浮点型数是具有相同特性和行为集合。二者的差异 程序猿通过定义一个类来适应问题,而不再被迫只能使用机器中的存储单元的数据类型
Light lt = new Light ();
lt.on(); //向lt发送消息 即调用方法
接口:接口确定了对某一特定对象所能发出的请求(即规定了特定对象的行为方法)
1.3 每个对象都提供服务
在解决业务问题而设计程序时,最好的方法之一就是将对象视为 服务的提供者
优点:提高对象的内聚性
1.4被隐藏的具体实现
程序猿分为:类创建者(创建类的人) 类消费者(使用类实例解决问题的人)
在任何交互关系中,具有关系所涉及的各方都遵守边界是十分重要的
类创建者可以隐藏一些类中的属性与方法 避免使用者直接访问,让类消费者无法触及他们不该触碰的部分
好处:1. 类创建者可以随意更改 隐藏部分的代码 而消费者无需察觉,不受影响 便于维护
2. 保护代码中的脆弱部分的暴露 防止错误使用出现bug
访问指定词:
public : 对任何元素 方法都可访问
private: 只允许类自身内部使用 继承也无法使用
protected : 允许类自身内部使用 同时也允许继承使用
默认(空): 访问包权限 同一个包内可以使用 跨包不可使用
1.5 复用具体实现
事实上复用性并没有达到我们想象中的那么理想,需要丰富的经验以及敏锐的洞察力
简单的复用某个类的方式(组合):直接使用该类的一个对象 将一个类的对象置于一个新类中这种方式被称为组合,如果组合是动态的 被称为聚合 组合被视为拥有关系 比如 汽车 和 引擎
在创建新类时首先因该考虑组合 而不是 集成
1.6 继承
难道在程序设计中只能不停创建新类型,如果一个类型与另一个类型具有相同的特性与行为是否还需要新创建一个类似的类型呢?
继承:一个类以一个现有类为基础复制它产生一个副本,然后通过添加修改这个副本来创建新类 java中需要使用关键字extend来实现
继承关系中:基类发生改变 子类同时会反应这些改变
子类不仅包含了基类中的所有成员(基类中private修饰的除外) 同时复制了基类的接口(private修饰的除外)
子类如果只集成父类不做任何改变 那么继承将是无意义的 所以使用继承需要思考 是否需要一个独特的子类
子类与父类异同的方式: 1.在子类中添加父类中没有的接口 (添加新方法) 这种需要反思 父类真的不需要添加这些接口吗
2.覆盖, 修改子类中继承父类的接口,改变方法的行为
是一个与像一个
是一个:当一个子类覆盖父类的所有方法 并没有增加新的接口,就意味着导出类与基类完全相同的类型。 可以用一个导出类对象完全替代一个基类对象。这被视为纯粹替代 又被成为替代原则
像一个:子类(到处类)中添加了新的接口元素,也就是扩展了接口。新类型依然可以替代基类,但并不完美,因为基类对象并不能完全替代子类对象 基类型无法使用新添加的接口(需要考虑基类是否需要接口扩展)
如何选择使用哪种方式 需要具体场景中的思考与使用
1.7伴随多态的可互换对象
多态:编写不依赖特定类型的代码。在处理类型层次结构时,把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。我们不关心对象是谁,只关心它的行为
好处:不受添加新类型的影响
疑问:使用多态构建程序时,将导出类的对象泛化为基类对象,更换新的导出类,编译器是如何准确执行不同导出类的接口方法,他是怎么做到的,而不是执行基类的方法(调用基类)
这里涉及到一些新的概念:
其实面向对象程序设计最重要的秘诀:编译器不是传统意义上的函数调用。
前期绑定:非面向对象编程的编译器的函数调用使用前期绑定,这意味着编译器将产生对一个具体函数名称的调用,运行时将这个调用解析到要被执行的代码的绝对地址上面。
后期绑定:编译器在编译时并不知道具体调用那个函数,调用代码是在运行时才确定的,实现方式是 java使用一小段特殊的代码来替代绝对地址的调用。代码使用 在对象中存储的信息 来计算方法的具体地址。根据这段代码的内容,每个对象都可以具有不同的行为表现。
向上转型:将导出类看做是基类的过程
1.8 单根继承结构
单根继承结构中:所有的对象都具有同一个共用接口,所有他们都具有共同的基类型
单根继承的好处:1.所有对象都具有某些基本功能,所有对象都可以很容易的在堆上创建,而参数传递也得到了简化
2.单根继承结构是垃圾回收器的实现变的容易
3.是有对象都属于同样的类型,使得编程避免了对象的无法确定类型的僵局
1.9 容器
容器:用来存储对象,他不受存储对象多少的影响,能够实现自我扩容,对编程带来极大的灵活性,程序猿只需将想要存储的数据放进容器即可
Java中容器实现的具体数据结构是不同的 使用起来的效率是有差异性的 比如 ArrayList 易于查找 LinkList 易于插入 效率是不同的
1.9.1泛型
容器中存储的是obj类型就可实现存放任何类型的对象,但是同时也会一些问题,在容器中存放进具体的某些类型对象,由于存放是进行了向上转型,拿出时对象的引用已经是obj类型了,很难明确引用对象对的具体类型,来使用对象执行特定的行为。这时泛型就出现了
向下转型:将对象按照继承结构,有上层的泛型类型转化为下层的具体类型
泛型的使用:一对尖括号,中间包含类信息 通过这些特征可以识别对泛型类的使用
ArrayList <Shape> list = new ArrayList();
1.10 对象的创建和生命周期
每个对象创建都需要资源,存活的对象会持久的占用资源,尤其是内存,这就是为啥要控制对象的创建与销毁因为资源是有限的
c++控制对象的生命周期,要求的是效率,所以他给程序猿足够的权限,要求程序员控制对象的生命周期。为了追求最大的执行速度,对象的存储空间和生命周期可以在编程时就确定,通过将对象放置在堆栈中或静态存储区域内来实现。这种方式将存储空间分配和释放放置于优先考虑的位置。 在编写程序的时候 程序员要清楚对象的确切位置与数量
java中使用被称为Heap(堆)的内存池中动态的创建对象。这种方式中,直到运行时才知道需要多少对象。他的生命周期数量类型只有在程序运行到某段代码时才能确。如果要创建一个新的对象可以直接在堆中创建。因为是运行时动态创建所以,需要在大量时间在堆中分配存储空间,这可能远远大于堆栈中创建新的空间
动态方式有这么一个一般性的逻辑:对象趋于复杂,所以对象的查找和释放存储空间的开销不会对对象的创建造成冲击。
java的垃圾回收器被设计用来处理内存问题,他可以发现不在需要使用的对象,对对象资源进行回收。
1.11异常处理
java中提供了良好的异常处理,异常是一个对象,在程序出错的位置被抛出,某些错误被要求必须处理
1.12 并发编程
计算机编程中的一个基本概念,在同一个时刻处理多个任务的思想。
最初他的实现是依靠在程序进行时,将程序停下来,处理其他问题在返回主线程处理问题。有许多方法可以实现这个目标,但是最初,程序猿使用有关机器的底层知识来实现这样的编程,但是带来了很多问题,可移植性很差,不同的机器无法实现通用
有时程序需要中断,去执行其他重要的任务,但是对于大量的其他问题,我们更多的是将问题切割成小块任务进行处理,从而提高程序的响应能力。
在程序中,彼此独立运行的部分称之为线程
线程的出现是为了提高单核计算机的运行速度。但如果操作系统支持多处理器,那么每个任务都可以指派不同的处理器,并且他们是在真正的并行执行。所以程序猿不需要操心到底是单核还是多核处理器。只要使用就好,多核处理器不使用其实速度也会很快
多线程的隐患:共享资源 比如打印机,一个线程在打印时,另一个线程不应该同时进行打印操作...java中使用任务锁来控制共享资源的使用,当一个线程执行打印时,使用任务锁将资源锁定,当完成任务时,再打开锁,释放共享资源
1.13 java 与 Internet
省略了。。。