第1章对象导论面向对象程序设计(Object-orientedProgramming,OOP)1.1抽象过程面向对象语言的五个基本特性:(1)万物皆为对象(2)程序是对象的集合,它们通过发送消息来告知彼此所要做的(3)每个对象都有自己的由其他对象所构成的存储(4)每个对象都有其类型(5)某一特特定类型的所有对象都可以接收同样的消息对象具有状态、行为和标识1.2每个对象都有一个接口对象都是唯一的,但同时具有相同的特性和行为的对象所归属的类的一部分。类描述了具有相同特性(数据元素)和行为(功能)的对象集合。类实际上是一个数据类型。程序设计挑战就是在问题空间的元素和解空间的对象之间创建一对一的映射。接口确定了对某一特定对象所能发出的请求,决定接口的便是类型。过程概括为:向某个对象“发送消息”(产生请求),这个对象便知道此消息的目的,然后执行对应的程序代码。1.3每个对象都提供服务对象即为“服务提供者”。(好处:提高内聚性)1.4被隐藏的具体实现访问控制存在原因:(1)让客户端程序员无法触及不应该触及的部分(2)允许类设计者改变内部的工作方式而不用担心影响到客户端程序员Java用于类内部设定边界:(访问指定词(accessspecifier))public、private、protected和默认的访问控制(包访问权限)1.5复用具体实现首先考虑使用组合。1.6继承基类(超类或父类)导出类(继承类或子类)继承不仅包括现有类型的所有成员(private成员被隐藏,不可访问),而且复制了基类的接口。基类和导出类产生差异的方法:一是添加新方法;二是覆盖(overriding)基类方法1.6.1“是一个”与“像是一个”关系“是一个”(is-a)视为纯粹替代,称为“替代关系”“像是一个”(is-like-a)具有旧类的接口,还包含其他方法1.7伴随多态的可互换对象前期绑定:编译器将产生对具体函数名字的调用,而运行时,将这个调用解析到将要被执行代码的绝对地址。后期绑定:Java使用一小段特殊的代码来替代绝对地址调用,这段代码中存储的信息来计算方法体的地址。(默认行为)向上转型(upcasting)把导出类看做是它的基类的过程。1.8单根继承结构终极基类的名字是Object单根继承的优点:一是保证所有对象具有某些功能(Object所有方法);二是所有对象可以很容易地在堆上创建;三是简化参数传递。1.9容器容器是在任何需要的时候都可以扩充自己以容纳你置于其中的所有东西。(List、Map、Set以及诸如队列、树、堆栈等)使用不同容器的原因:一是不同容器提供了不同的接口和外部行为;二是不同容器对于某些操作具有不同的效率。1.9.1参数化类型JavaSE5之前通过存储Object的容器可以存储任何东西,使得容器被复用,缺点是:当从容器取出对象时,还是必须要以某种方式记住这些对象究竟是什么类型,这样才能执行向下转型(除非确切知道所要处理的对象的类型,否则向下转型是不安全的)。解决方案称为参数化类型机制,就是一个编译器可以自动定制作用于特定类型上的类。1.10对象的创建和生命期使用对象时,最关键问题之一便是它们的生成和销毁方式。对象数据存储位置:一是将对象置于堆栈或静态存储区域(效率高,灵活性差);二是堆(heap)的内存池中动态创建对象(存储空间运行时动态管理,需要大量时间在堆中分配空间)。Java采取动态内存分配方式。对象的生命周期:Java提供了被称为“垃圾回收器”的机制,可以自动发现对象何时不再被使用,并继而销毁它。1.11异常处理:处理错误异常是一种对象,它从出错地点被“抛出”,并被专门设计用来处理特定类型错误的相应的异常处理器“捕获”。异常作用就是提供了一种从错误状态进行可靠恢复的途径。1.12并发编程并发的概念就是把问题切分成多个可独立运行的部分(任务),从而提高程序的响应能力。在程序中,这种彼此独立运行的部分称之为线程。并发存在的隐患:共享资源,解决方案:锁定资源,完成任务后,释放资源锁。1.13Java和Internet1.13.1Web是什么1、客户/服务器计算技术客户/服务器系统的核心思想是:系统具有一个中央信息存储池(centralrepositoryofinformation),用来存储某种数据,它通常存在于数据库中,可以根据需要将它分发给某些人或机器集群。(关键在于信息存储池的位置集中于中央,使得它可以被修改,并且这些修改将被传播给信息消费者)信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息,然后将它们显示在被称为客户机的用户机器上。事务处理:保证一个客户插入的新数据不会覆盖另一个客户插入的新数据,也不会将其添加到数据库的过程中丢失。客户/服务器计算技术大概占了所有程序设计行为的一半。2、Web就是一台巨型服务器Web发展过程:1、简单单向过程(对服务器产生一个请求,它返回一个文件,浏览器软件根据本地机器的格式解读文件);2、客户可以将信息反馈给服务器;3、客户机执行运算任务客户端浏览器运行程序的能力,这被称为“客户端编程”1.13.2客户端编程Web最初的“服务器-浏览器”设计是为了能够提供交互性的内容,但是交互性完全由服务器提供。服务器产生静态页面,提供给只能解释并显示它们的客户端浏览器。HTML包含有简单的数据收集机制:文本输入框、复选框、单选框、列表和下拉式列表以及按钮——它只能被编程来实现复位表单上的数据或提交表单上的数据给服务器。这种提动作通过所有的Web服务器都提供的通用网关接口(commongatewayinterface,CGI)传递。提交内容会告诉CGI应该如何处理它。可以通过CGI做任何事情。CGI程序复杂而难以维护,并同时响应时间过长的问题。响应时间依赖于所必须发送的数据量的大小,以及服务器和Internet的负载。问题的解决方法就是客户端编程。意味着:Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果各加迅捷,而且使得网站更加具有交互性。客户端编程的问题是:它与通常意义上的编程十分不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。1、插件(plug-in)插件的价值在于:它允许专家级的程序员不需经过浏览器生产厂家的许可,就可以开发某种语言的扩展,并将它们添加到服务器中。提供了一个“后门”,使得可以创建新的客户端编程语言。2、脚本语言(scriptinglanguage)通过使用脚本语言,可以将客户端程序的源代码直接嵌入到HTML页面中,解释这种语言的插件在HTML页面被显示时自动激活。优点是易于理解,因为它只是作为HTML页面一部分的简单文本,当服务器收到要获取该页面的请求时,它们可以被快速加载。缺点是代码会暴露给任何人去浏览(或窃取)。JavaScript语言优缺点。用于创建更丰富、更具有交互性的图形化用户界面(graphicuserinterface,GUI)。3、JavaJava是通过applet以及使用JavaWebStart来进行客户端编程。4、备选方案Macromedia的Flex,允许创建基于Flash的与applet相当的应用。ActionScript语言是基于ECMAScript的,Flex使得在编程时无需担心浏览器的相关性,因此远比JavaScript要吸引人得多。值得考虑的备选方案。5、.NET和C#它要求客户端必须运行Windows平台。6、Internet和Intranet1.13.3服务器端编程基于Java的Web服务器,它让你用Java编写的被称为servlet的程序来实现服务器端编程。Servlet及其衍生物JSP,消除了处理具有不同能力的浏览器所遇到的问题。第2章一切都是对象2.1用引用操纵对象引用(reference)对象(object)2.2必须由你创建所有对象引用与对象关联通过new操作符2.2.1存储到什么地方1)寄存器:最快的存储区,数量极其有限,根据需求分配,不能直接控制2)堆栈:位于通用RAM(随机访问存储)中,通过堆栈指针可以从处理器获得直接支持,Java对象引用、基本类型存储于堆栈,对象并不处于其中3)堆:通用内存池(也位于RAM),灵活,需更多时间分配和清理4)常量存储:存放在程序代码内部或ROM5)非RAM存储:例子是流对象和持久化对象(磁盘等永久存储空间)2.2.2特例:基本类型基本类型不用new创建变量,而是创建一个并非引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。booleancharbyteshortintlongfloatdouble包装器类:可以在堆中创建一个非基本对象,用来表示对应的基本类型。自动装箱、自动拆箱高精度计算的类:BigInteger、BigDecimal2.2.3Java中的数组创建一个数组对象,实际上就是创建了一个引用数组,自动初始化为null。2.3永远不需要销毁对象变量的生命周期2.3.1作用域(scope)(基本类型)作用域由花括号的位置决定,决定了其内定义的变量名的可见性和生命周期。2.2.2对象的作用域Java对象不具备和基本类型一样的生命周期。当new创建一个Java对象时,它可以存活在作用域之外,当引用在作用域终点消失了,引用所指向的对象仍然继续占据内存空间,作用域之后,无法访问该对象,因为它的唯一引用超出了作用域范围。Java垃圾回收器,用于监视new创建的所有对象,辨别不会再被引用的对象,释放内存空间,供其他对象使用。2.4创建新的数据类型:类关键字class用于引入一种新的类型,决定了某一类对象的外观和行为。2.4.1字段和方法字段可以是任何类型的对象。2.5方法、参数和返回值Java方法决定对象能够接收什么样消息(提供什么样的服务)。基本组成部分:名称、参数、返回值和方法体方法签名(唯一地标识出某个方法)=方法名+参数列表调用方法的行为通常称为发送消息给对象。2.5.1参数列表方法的参数列表指定要传递给方法什么样的消息。在参数列表中必须指定每个所传递对象的类型及名字。传递的实际是对象的引用。return关键字含义:一是已经做完了离开此方法;二是返回方法计算结果。2.6构建一个Java程序2.6.1名字可见性Java通过包即类库解决名字冲突,反转域名,句点代表子目录的划分。包名都是小写。2.6.2运用其他构件import指示编译器导入一个包,也就是一个类库。通配符“*”2.6.3static关键字执行new来创建对象,存储空间才被分配,方法才供外界调用。声明为static,就意味着域和方法不会与包含它的那个类的任何对象实例关联在一起。static字段只有一份存储空间,为所有对象共享。2.7你的第一个Java程序2.7.1编译和运行java和javac命令2.8注释和嵌入式文档段注释/*……*/行注释//2.8.1注释文档javadoc用于提取注释文档的工具,在文件中查找特殊注释标签。输出为html文件2.8.2语法Javadoc只能为public和protected成员进行文档注释,private和包内成员注释自动被忽略(可以通过-private标记,以便把private成员的注释包含在内)2.8.3嵌入式HTMLJavadoc通过生成的HTML文档传送HTML命令,使得充分利用HTML对代码进行格式化所有类型的注释文档都支持嵌入式HTML2.8.4一些标签示例@see{@linkpackage.class#nemeberlabel}{@docRoot}{@inheritDoc}@version@author@since@param@return@throws@deprecated2.8.5文档示例2.9编码风格驼峰风格第3章操作符3.1更简单的打印语句静态导入(staticimport)3.2使用Java操作符几乎所有操作符只能操作“基本类型”,例外的操作符是“=”、“==”和“!=”,能操作所有对象;String类型支持“+”和