您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > ThinkinginJava第一章
第一章对象导论1.1抽象过程AlanKay总结出OOP五大特性:1)万物接对象:它能存储数据,可在自身上执行操作。理论上,可以抽取待求解问题的任何概念化构建(实体、服务等),将其表示为程序中的对象。2)程序是对象的集合,它们通过发送消息来告知彼此所要做的:要请求一个对象,就必须对该对象发送一条消息。其实消息就是对某个特定对象的方法的调用请求。(消息——对象方法的调用。)3)每个对象都有自己的有其他对象所构成的存储:对象可以用来构成其它对象的一部分,程序中可以构建复杂体系,同时将其复杂性隐藏在对象的简单性背后。4)每个对象都拥有类:每个对象都是某个类的实体。5)某一特定类型的所有对象都可以接受同样的消息。这种可替代性(substitutability)是OOP中最强有力的概念之一。1.2每个对象都有一个接口面向对象程序设计的挑战之一,就是在问题空间的元素和解空间的对象之间创建一对一的映射。接口(对象方法的抽象)确定了对某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码,这些代码与隐藏的数据一起构成了实现(对象方法的调用)。1.3每个对象都提供服务当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者(serviceprovider)”。程序本身将向用户提供服务,他将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或者在现有库中寻找类来创建)能够提供理想的服务来解决问题的一系列对象。将对象看作是服务提供者还有一个附加好处:它有助于提高对象的内聚性。高内聚性可以提高对象的复用性。1.4被抽象的具体实现将程序开发人员按角色分为类创建者(构建类)和客户端程序员(用类和对象创建程序)。访问控制的作用:1)让客户端程序员无法触及他们不应触及的部分;优点:减少BUG,并且让客户端程序员更专心2)库设计者可以改变类内部结构而不用担心会影响到客户端程序员。访问控制的方式:1)public、private、protected2)Java的默认访问权限——包访问权限:当没用到任何访问指定词时,它将发挥作用。在这种权限下,类可以访问在同一个包(库构建)中的其他成员,但是在包外,则不能访问。1.5复用具体实现Association(关联):UsestheservicesofanotherclassAggregation(聚合):Aclass“owns”anotherclassComposition(组合):Aclassiscomposedofanotherclass;referstoanaggregationwithinwhichthecomponentpartsandthelargerencompassingwholesharealifetime聚合(aggregation):使用现有类(的对象)合成新类。生存周期互不影响。组合(composition):也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。组合经常被视为“has--a”(拥有)关系,就像我们通常说的“汽车hasa引擎”一样。下面是UML图:用实心菱形表明了组合关系;空心菱形用来表示聚合关系;而关联则用没有菱形的线来表示。聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。你和你的心脏之间是composition组合关系(拥有且必须,没了不能活)你和你买的书之间是aggregation聚合关系(拥有但不必须)你和你的朋友之间是association关联关系(谁也不拥有谁)聚合、关联、组合是对象间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合、关联、组合则是对象的横向关系。其关系的强弱为:关联聚合组合从编程的角度上来说:聚合:AhasaBclassA中应该包含classB的对象引用;组合:Acontains-aBclassA中应该包含classB的对象本身,要创建calssA的对象,就肯定创建了classB的对象,A的对象从内存中撤销,则B的对象也跟着消失。在程序设计时,应先考虑组合,后考虑继承。继承会使得程序变得复杂,而组合可以使程序更安全,复用性更高(通过将内容类的成员设置为私有)。1.6继承左图中父类在上,子类在下。它们之间的继承关系用空心三角箭头来表示。下面的图代表一个例子:is-a(是一个)和is-like-a(像是一个):1)is-a:当继承为纯粹替代(替代原则)时,父类和子类之间的关系式is-a。这种替代,子类只覆盖基类的方法,而不创建新的方法。它们具有完全相同的接口。2)is-like-a:继承时会在子类中添加父类中没有的新方法。1.7伴随多态的可互换对象多态的好处:用基类对象来表示子类对象,对所有不同子类对象可以进行统一处理。在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而将其当做其基类的对象来对待。这使得人们可以编写出不依赖于特定类型的代码。这种操作成为泛化(generic)。这样,即使在以后要为基类添加新的子类,也不用更改之前写的泛化代码。OOP语言用后期绑定来处理对象方法的调用。当想对象发送消息时,被调用的代码直到运行时才能确定。为了执行后期绑定,java使用一小段特殊的代码替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。在Java中,动态绑定是默认的,不需要像C++一样添加额外的关键字来实现多态。例:如图,下面是图形类族树代码:voiddoSomething(Shapeshape){shape.erase();//...shape.draw();}对象方法调用:Circlecircle=newCircle();Triangletriangle=newTriangle();Lineline=newLine();doSomething(circle);doSomething(triangle);doSomething(line);在调用时,子类被当做基类,这种过程成为向上转型(upcasting),一个面向对象程序肯定会在某处包含向上转型,因为这正是将自己从必须指导的确切类型中解放出来的关键。1.8单根继承结构Java单根继承自Object。在单根继承结构中的所有对象都具有一个共同接口,所以它们归根到底都是相同的基本类型。单根继承的好处:单根继承结构使垃圾回收器的实现变得容易的多,而且对于系统级操作(如异常处理)显得尤其重要,并为编程带来了更大的灵活性。1.9容器容器:是一种用来统一控制对象的集合,它持有对其他对象的引用。它本身也是一种对象,是其他对象的容器(包含的是引用),可以随时动态扩充,并且可以自己管理容器中的对象。Java中的容器:List(用来存储序列),Map(也成为关联数组,用来创建对象之间的关联),Set(每种对象类型只持有一个),以及诸如队列、树、堆栈等更多的构件。不同的容器因为底层结构的不同,在接口和外部行为,以及相同操作的效率上,都表现出很大的区别。所以在编程时,要根据具体情况进行挑选,用最合适的容器来存储对象。而接口List所带来的抽象,把在容器之间进行转换时对代码产生的影响降低到了最小限度。Java的容器以前设计为存贮object类型的,在取出对象时,也是object,就失去了其特定对象的身份。为了解决这个问题,Java在SE5时引入范型概念。它指定存入容器的对象必须是制定类型,这样在取出时,自然也不需要再向下转型了。如:ArrayListShapeshapes=newArrayListShape();1.10对象的创建和生命期两种控制对象内存的方式:1)对象在栈中存储(被称为自动变量automaticvariable或限域变量scopedvariable)或在静态存储区域内实现。优点:这种方式将存储空间分配和释放置于优先考虑的位置,这样做可以追求最大的执行速度。缺点:但是,也牺牲了灵活性,因为必须在编写程序时指导对象的确切数量、生命周期和类型。如果试图解决更一般化的问题,例如计算机辅助设计、仓库管理或者空中交通控制,这种方式就显的过于受限了。2)第二种方式:在被称为堆(heap)的内存池中动态的创建对象。这种方式,直到运行时才知道需要多少对象,他们的生命周期如何,以及他们的具体类型是什么。如果需要一个新的对象,可以在需要的时刻直接在堆中创建。存储空间在运行时被动态管理。缺点:因为动态管理存储空间,所以需要大量时间在堆中分配存储空间,远大于第一种在栈中创建存储空间的时间。在栈中创建存储空间和释放存储空间通常个需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。而创建堆存储空间的时间依赖于存储机制的设计。动态方式的一般性逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。Java完全采用了动态内存分配方式。每当想要创建新对象是,就要使用new关键字来构建此对象的动态实例。1.11异常处理:处理错误异常是一种对象,它从出错地点被“抛出”,并被专门设计用来处理特定类型错误的响应的异常处理器“捕获”。异常处理就像是与程序正常执行路径并行的、在错误发生时执行的另一条路径。因为他是另一条完全分离的执行路径,所以他不会干扰正常执行的代码。异常不能被忽略,所以它保证一定会在某处得到处理。异常能够提供一种从错误状态进行可靠回复的途径。你不仅可以使用异常来退出出错的程序,还可以通过异常处理来进行校正,并恢复程序的执行,来编写出更加健壮的程序。Java内置了异常处理,而且是强制要求编程者使用。异常处理是Java唯一可接受的错误报告方式,如果没有编写正确的处理异常的代码,就会得到一条编译时的出错消息。1.12并发编程(Concurrentprogramming)在编程时,可以将问题切分成多个可独立运行的部分(任务),从而提高程序的响应能力。在程序中,这些彼此独立运行的部分称之为线程(thread),上述概念被称为“并发”(concurrency)。并发最常见的例子就是用户界面(userinterface),通过使用任务(tasks),一个用户可以在按下按钮后快速得到一个相应,而不用被迫等待到程序完成当前任务为止。通常,线程只是一种为单一处理器分配执行时间的手段。但是如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,并且他们是在真正的并行执行。在语言级别上(atthelanguagelevel),多线程带来的便利之一就是,程序员不用再操心机器上是有一个还是多个处理器。由于程序在逻辑上被分成多个任务(tasks),所以如果机器拥有多个处理器,那么程序不需要特殊调整也能执行得更快。(即,多线程会自动被多处理器执行??)Concurrency的隐患:共享的资源。如果你有多个任务想要访问统一个资源,就会出现问题。例如,两个处理器不能同时像一台打印机发送信息。为了解决这个问题,可以共享的资源,例如打印机,必须在使用期间被锁定。因此,整个过程是:某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源。Java的并发时内置于语言中的,JavaSE5已经增天了大量额外的库支持。1.13Java与Internet客户端编程(client-sideprogramming),在客户端浏览器中运行程序(applet?),解决浏览器不能够快速交互和处理信息的能力。HTML中数据的提交,是通过Web服务器提供的通用网关接口(commongatewayinterface,CGI)来传递。提交的内容会告诉CGI应该如何处理它。最常见的动作就是运行一个在服
本文标题:ThinkinginJava第一章
链接地址:https://www.777doc.com/doc-2851990 .html