OOP特征:(Object Oriented programming)

(1)所有东西都是对象。

        将对象想象成一种新型数据,它保存着数据,可以按要求对它自身进行操作

(2)程序是一大堆对象的组合;

        通过消息传递,各对象知道自己做了什么,可以要求对象做某些事,即调用某些方法

(3)每个对象都有自己的存储空间,可以容纳其他对象;

        封装现有对象,可做出新型对象

(4)每个对象都有一种类型

        每个对象都是一个“类”的“实例”,Class和type同义

(5)同一类型的所有对象可以接受相同的消息

        体现“可替换性”(Substituability)

 

 

方案空间:机器模型

问题空间:问题模型

对象:在问题空间及方案空间中的表示物

 

一个类具有自己的通用特征和行为

Type和Class一样

 

面临挑战:如何在问题空间和方案空间中建立一对一的映射关系

(1)向对象发出请求是通过“接口”定义的,对象的“类”规定了“接口”的形式

 

控制对成员访问的原因:

1、防止他们碰到不该修改的内部数据及结构

2、简化操作

 

fiendly:能在本package里使用

新建类一般使用private

 

Java从业人员

①类创建者:创建各种类型的类,并封装起来,提供给客户程序员“接口”

②客户程序员:通过“接口”使用用类创建者创建的类,并且不用修改原类的结构

 

接口与实现方法隔离开的原因

①用户不需要知道类的内部结构,且不能改变

②可以修改类的内部结构而不对使用那个类产生影响

 

方案的重复使用

在原有类的基础上可以“组织”新类,或者新类可以包含原有类,例如“一辆车包含一个变速箱”,车是新类,变速箱是原有类

 

继承:能在实现原有类(父类、超类、基础类)的功能的情况下扩展新的功能(子类、继承类

 

基础类与继承类区分的方法

①增加新的函数

②为衍生类的函数进行新的定义

 

等价与类似关系:

因为继承类包含了新的函数,所以不能与基础类完全等价,只能说是类似,父类的接口不能完全实现子类的方法,例如只安装了“制冷”接口的房间换成冷、热空调也只能放冷气,而不能制热

若是子类不包含新的函数,就可以说和父类等价么?子类 is a 父类?

若包含新的,则 子类is like a 父类?

 

多态:调用一个方法时,它并不知道具体操作的对象的类型是什么,但采取的行动同样是正确的(子类对象调用父类的大家共有的方法,而不是子类特有的方法)

动态绑定:实现多态的方法

抽象类:我们不希望有人对基础类实现对象,只提供一个接口时,就定义一个抽象类

 

在C++中,

①为了控制执行效率,把对象存储在堆栈中或静态存储区域,以便为变量赋予不同的优先级,但失去了灵活性,在编写程序时,我们必须要知道对象的数量、存在时间以及类型,不便于解决如计算机辅助设计、仓库管理或者空中交通控制之类的问题。

②在内存堆中创建对象,可以当程序运行时再创建,比较灵活,对于对象的数量、存在时间以及类型可以在运行时再规定,但是分配存储空间的时间比在堆栈里要长得多

堆栈或静态存储区域中,编译器会自动根据对象的lifetime“破坏”或“清除”它

内存堆中,有两种方法破坏:

①程序化处理

②“垃圾收集器”自动识别并处理,但是会使程序支付其额外的开销

Java中用的就是“垃圾收集器”

 

集合:可以容纳解决新问题的其他类的容器

例如一个集合里有链表、有数组,那么解决不同问题时会用不同的类型,例如进行随机访问时就会用数组而不是链表

 

单根结构:所有继承类都只有一个父类

 

单根结构的优点

所有的对象只有一个接口,保证他们是同一个类型,

方便地实现一个垃圾收集器,只需将相应的支持安装于基础类中

由于运行期的对象肯定存在于所有对象中,所以永远不会存在判断不出对象类型的情况发生,这样有利于系统级的操作,例如异常控制,而且也能在程序设计时获得更大的灵活性

 

如何使用 集合库:

使用Java集合库里的对象时,需要下溯造型(Downcasting),因为库里的对象是Object类型的,不能确认其标识,需要强制标识它后才能用,但万一标错了,会有Exception(异常)处理

 

对象的创建和清除

在Java中,对象是在内存堆(heap)里创建的,需要垃圾收集器来自动清理,但是即使是单根模式,也会很耗开销,并且有一种不连贯性,在需要保持连贯性的实时程序中不方便使用

 

“异常”控制

异常控制将错误的控制方案内置于语言中,有时甚至内置于操作系统中。

“异常”(Exception)属于一个特殊的对象,在产生错误的地方一个Exception会被throw出来,并且被一个或几个exception控制器catch。

 

Java的exceptiion机制是封装好的,所以必须使用它,能更好的使程序员实时修改程序,保证程序的连贯性

 

多线程:

要在一个程序里处理多任务时,如果用“中断”,会造成其他昂贵的开销,但在某些实时性很强的任务中,实行中断是有必要的

在其他任务中,将任务划分进一些独立运行的程序片段中,使程序更快地响应用户的请求,,这些独立的片段就是线程(Thread)

例如,用户界面,不同的按钮是线程,用户界面是程序,当用户按了一个按钮后,程序可立即响应用户请求,而不是等用户界面这个程序完成后才能响应请求

并行计算

一个线程是用于分配一个处理器的分配时间的工具,但如果一台电脑有多个处理器,那个每个线程都可分配给不同的处理器,真正进入“并行计算”的状态

处理器越多,理论上程序运行越快

锁定

在共享资源问题上,即当不同的线程需要访问同一个资源时就会有冲突,例如要访问同一个打印机,那么一个线程可以先锁定资源,另一个线程就不能访问,当第一个线程解锁后,后者才能访问

synchronized关键字

java的多线程是内置到语言中的,即一个对象对应一个线程,内存是资源,所以一个对象在同一时间占用一个内存空间而不会有别的对象来占用,要使用synchronized关键字

永久性

有限永久,即把对象存到硬盘上时仍然需要调用,用到时仍然需要取出,但在程序结束后对象里存储的信息仍然存在

 

java除了能解决传统的设计问题外,还能解决万维网上的编程问题

 

服务器

将各种元素集中到一起,信息仓库、用于投递信息的软件以及信息及软件所在的那台机器

客户机

而对那些驻留在远程机器上的软件,它们需要与服务器通信,取回信息,进行适当的处理,然后在远程机器上显示出来

 

客户端编程

服务器一般为客户浏览器产生静态网页,由后者简单地解释并显示出来。基本HTML 语言提供了简单的数据收集机制:文字输入框、复选框、单选钮、列表以及下拉列表等,另外还有一个按钮,只能由程序规定重新设置表单中的数据,以便回传给服务器。用户提交的信息通过所有Web服务器均能支持的“通用网关接口”(CGI)回传到服务器

Java 通过“程序片”(Applet)巧妙地解决了客户端编程的问题

 

插件

插件的价值在于它允许专业程序员设计出一种新的语言,并将那种语言添加到浏览器,同时不必经过浏览器原创者的许可。

 

Java的沙箱:

检测程序,别且阻止其将文件写入程序或删除文件的行为,比ActiveX安全,后者是什么都可以做,安全性没保障

 

服务器端编程

对数据库的修改、查询等,如servlet

 

时刻提醒自己注意以下几个问题: 
(1) 对象是什么?(怎样将自己的项目分割成一系列单独的组件?) 
(2) 它们的接口是什么?(需要将什么消息发给每一个对象?) 
在确定了对象和它们的接口后,便可着手编写一个程序

 

阶段 0:拟出一个计划

第一步是决定在后面的过程中采取哪些步骤

阶段 1:要制作什么?

这个阶段称为“建立需求分析和系统规格”

需求分析的意思是“建立一系列规则,根据它判断任务什么时候完成,以及客户怎样才能满意”。
系统规格则表示“这里是一些具体的说明,让你知道程序需要做什么(而不是怎样做)才能满足要求”,应尽可能总结出自己系统的一套完整的“使用条件”或者“应用场合”,并做一些时间安排

阶段 2:如何构建?

出了对对象以及它们的接口的说明后,就完成了第2 阶段的工作。我们真正需要关心的是最终找出所有的对象。

阶段 3:开始创建

全面地考察自己的程序,确定提出的所有要求均已满足。

阶段 4:校订

不仅需要理解自己构建的是什么,也要理解程序如何不断地进化

什么时候才叫“达到理想的状态”呢?这并不仅仅意味着程序必须按要求的那样工作,并能适应各种指定的
“使用条件”,它也意味着代码的内部结构应当尽善尽美。至少,我们应能感觉出整个结构都能良好地协调
运作。没有笨拙的语法,没有臃肿的对象,也没有一些华而不实的东西。除此以外,必须保证程序结构有很
强的生命力

 

根据估计,没有计划的50%以上的项目都会失败