面向对象程序设计(Object-oriented Propramming, OOP)

 

1.1 抽象过程

面向对象思想的实质:程序可以通过添加新类型的对象使自身适用于某个特定问题。

面向对象思想的五个基本特征:

1)万物皆对象

2)程序是对象的集合

3)每个对象都有自己的由其他对象所构成的存储

4)每个对象都有其类型

5)某一特定类型的所有对象都可以接收同样的消息

对象具有行为、状态和标识,这意味着每一个对象都可以有内部数据(他们给出了该对象的状态) 和方法(他们产生行为),每一个人对象在内存中都有一个唯一的地址。

 

1.2 每个对象都有一个接口

创建抽象数据类型是面向对象程序设计的基本概念之一。

类描述了具有相同特性(数据元素)和行为(功能)的对象集合。

 

1.3 每个对象都提供服务

试图理解一个服务设计时,最好的方法就是将对象想想为“服务提供者”。

 

1.4 被隐藏的具体实现

程序员按照角色分为类创建(构建类)和客户端程序员(收集各种用来实现快速应用开发的类)。

访问控制存在的第一个原因是让客户端程序员无法触及到他们不应该触摸到的部分。

第二个原因是允许类库设计者可以改变 内部的工作方式而不会担心影响到客户端程序员。

public: 公用的,任何人都可以访问的;

private:私有成员变量;

protected:受保护的;

默认: 包访问权限:类可以访问在同一个包下的其他成员。

 

1.5 复用具体实现

一旦类被创建并被测试完,那么他就应该代表一个有用的代码单元。

代码复用是面向对象思想最了不起的优点之一。

组合:使用现有的类合成一个新的类。如果组合是动态发生的,那么它通常称为聚合。组合被视为“has-a"关系。

组合带来了巨大的灵活性,新类的成员通常都被声明为private。

在建立新类的时候,应该首先考虑组合关系。因为组合更简单灵活,处处使用继承会导致难以使用并过分的设计。

 

1.6 继承

以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类。通过继承就可以达到这个效果,不过也有例外,当源类(被称为基类、超类或者父类)发生变动时,被修改的副本(也被称为导出类、继承类或者子类)也会反映出这种变动。 

类型不仅仅是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系。

继承使用基类型和异出类型的概念表示:两个类型具有相同的行为和特性,但其中一个类型可能比另一个含有更多的特性。

第一种使导出类和基类产生差异的方法是直接在导出类中添加新的方法。

虽然继承意味着接口中添加新的方法,但并非总需如此。第二种使导出类和基类之间产生差异的方法是改变现有基类的方法的行为,称之为覆盖。

替代原则:可以用一个导出类对象来完全替代一个基类对象,这可以称之为纯粹替代。我们称这种情况下的基类与导出类之间的关系为  is-a

有时候必须在导出类中添加新的接口元素,这样就扩展了接口。这个新类仍然可以替代基类,但是这种替代并不完美,因为基类无法访问新添加的方法。这种情况我们可以描述为is-like-a 关系。

 

1.7 伴随多态的可互换对象

后缀绑定:当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型的),但是并不知道将被执行的确切代码。

向上转型:通常基类在顶部,而导出类在其下部散开,因此,转型就是在继承图中向上移动。

 

1.8 单根继承结构

在java中,是否所有的类都继承自一个基类,答案是yes,即Object。

在单根继承结构中的所有对象都具有一个共同接口,所以他们归根结底都是相同的基本类型。

单根继承结构保证所有的对象都具备某些功能。单根继承结构使垃圾回收器的实现变得容易的多。

 

1.9 容器

容器:在任何需要的时候,都可以扩充自己以容纳你置于其中的所有东西。

(1)不同容器对于提供了不同的接口和外部行为。

(2)不同容器对于某些操作具有不同的效率。(linkedlisit 和ArrayList   前者插入元素效率更高,后者查询效率更高)

1.9.1 参数化类型

向下转型:向下转为更具体的实例。向上转型是安全的,除非确切地知道所要处理的对象的类型,否则向下转型几乎是不安全的。

参数化类型机制:就是一个编译器可以自动定制作用于特定类型上的类。例如:通过使用参数化类型(泛型),编译器可以定制一个只接纳和取出Shape对象的容器。

泛型:一对尖括号,中间包含类型信息。

 

1.10 对象的生命周期

每个对象为了生存都需要资源,尤其是内存。当我们不在需要一个对象时,它必须被清理掉,使其占有的资源可以被释放和重用。

java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。

对象的生命周期:对于允许在堆栈上创建对象的语言,编译器可以确定对象的存活时间,并可以自动销毁它。然而,如果是在对上创建对象,编译器就会对对象的生命周期一无所知。java提供了被称为“垃圾回收器”的机制,可以自动发现对象何时不再使用,并继而销毁它。垃圾回收器减少了所需要考虑的议题和必须编写的代码,更重要的是垃圾回收期提供了更重要的保障,可以避免暗藏的内存泄漏问题。

 

1.11 异常处理: 处理错误

异常是一种对象,它从出错点被“抛出”,并被专门设计用来处理特定类型错误的相应的异常处理器“捕获”。

值得注意的是,异常处理不是面向对象的特征,他在面向对象语言出现之前就已经出现了。

 

1.12 并发编程

就是在同一时刻处理多个任务的思想。

线程:在程序中,彼此独立的运行的部分被称为线程。

并发又一个隐患:共享资源,如果多个并行任务都要访问同一个资源,那么就会出现问题。解决方案:任务锁定资源 ,完成任务,释放资源锁,使其他任务可以使用资源。

 

1.13 Java与Internet

1.3.1 web

(1)客户/服务器系统

核心思想是:系统具有一个中央信息储存池,用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人员或机器集群。

服务器:信息储存池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。

事务处理:必须保证一个客户插入的新数据不会覆盖另一个客户插入的新数据,也不会将其添加到数据库的过程中丢失。

(2)web就是一个巨型服务器

web实际上就是一个巨型客户/服务器系统,单稍微差一点,因为所有的服务器和客户机都同事共存于同一个网络中。

1.3.2 客户端编程

y网通关接口(common gateway interface, CGI),当今许多有影响力的网站完全构架你与CGI至上,实际上你可以通过CGI做任何事。但是构建于CGI程序至上的网站可能会迅速变得过于复杂而难以维护,并同时响应时间过长的问题。CGI程序的响应时间依赖于所必须发送的数据的大小,以及服务器和Internet的负载。

(1)插件

客户端编程所迈出的最重要的一步就是插件(plug-in)的开发。程序员可以下载一段代码,并将其插入到浏览器中适当的位置。

(2)脚本语言

插件引发了浏览器脚本语言(scripting language)的开发。通过使用某种脚本语言,可以将客户端程序的源代码直接嵌入到HTML页面中,解释这种语言的插件在HTML页面被显示时自动激活。脚本语言先天易于理解,当服务器收到要获取该页面的请求时,他们可以快速被加载。缺点是代码会暴露给任何人去浏览。但是通常不会使用脚本去做相当复杂的事。

在web页面使用的脚本语言主要是用来创建更丰富、更具有交互性的图形化用户界面(graphic user interface, GUI)。

(3)JAVA

JAVA 是一种功能强大的、安全的、跨平台的、国际化的编程语言。java 是通过applet(只在web浏览器中运行的小程序,它是作为网页的一部分自动下载的)以及使用java web start来进行客户端编程的。

(4)备选方案

(5).NET和C#

.NET平台大致相当于java虚拟机和java类库,C#与java有类似之处。

(6)Internet与Intranet

当web技术仅限用于特定公司的信息网络时,它就被称为Intranet(企业内部网)。

Intranet比Internet提供了更高的安全性,因为可以物理地控制对公司内部服务器的访问。

1.3.3 服务器端编程

 数据库请求必须通过故武器端的某些代码来处理,这就是所谓的服务器端编程。