java编程思想--1对象导论

人类能解决问题的复杂性直接取决于抽象的类型和质量。有两种抽象模式:

一、根据运行解决方案的计算机来描述问题,程序员必须建立计算机模型和实际待解决模型之间的关联关系如BASIC、C等语言。

二、只针对待解决问题进行建模,程序可以通过添加新类型的对象使自身适用于某个特定的问题。

面向对象的特性:(1)万物皆为对象
(2)程序是对象的集合,他们通过发送消息来告知彼此要做的事情
(3)每个对象都有自己的由其他对象构成的存储,即所有的对象都是由其他对象组成的。 称之为创建一个成员对象。这种概念成为“组合”。
(4)每个对象都有其类型,即每个对象都是一种数据类型(class)的实例。
(5)某一特定类型的所有对象都可以接收同样的消息,貌似是接口或者继承概念
简而言之,对象具有状态、行为和标示:每一个对象都可以拥有内部数据(它们能给出对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一的与其他对象区分开来。

1.2每个对象都有一个接口
每一个对象只能满足某些请求,这些请求由对象的接口(Interface)定义,决定接口的便是类型。接口确定了对于某一特定对象所能发出的请求。

1.3每个对象都能提供服务
当正在试图开发或理解一个程序时,最好的方法就是将对象想象成“服务提供者”。程序本身向用户提供服务,通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建能够提供理想服务的一系列对象。
将对象当做服务提供者还有一个附带的好处:有助于提高对象的内聚性。高内聚、低耦合

1.4被隐藏的具体实现
将程序开发人员按照角色划分为类创建者(创建新数据类型的程序员)和客户端程序员(在应用中使用数据类型的类消费者)是大有裨益。
访问控制的第一个原因:让客户端程序员无法触及他 们不应该接触到的东西。第二个原因:允许库设计者改变类类内部的工作方式而不用担心影响到客户端程序员。如果接口和实现可以清晰的分离并得以保护,那么你就可以轻而易举的完成这项工作。

1.5复用具体实现
如何组合是动态发生的,那么他可以称为“聚合”。组合关系经常被视为“has-a”(拥有)关系。组合和聚合的区别,建立新类时,优先考虑组合然后才是继承关系。
聚合:表示两个对象之间是整体和部分的弱关系,部分的生命周期可以超越整体。如电脑和鼠标,就可以用一下图形表示:
X
组合:表示两个对象之间是整体和部分的强关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在。组合关系的“部分”,是不能在整体之间进行共享的。如人和眼睛的关系:

1.6继承
对象使得你可以将数据和功能封装在一起。
继承分两种:1.is-a(是一个)关系,子类只重写父类方法,不添加新的方法,这是处理继承的理想方法;2.is-like-a(像一个)关系,有时必须在子类中添加新的接口元素,这样就扩展了接口,新的类型仍然可以替代基类但是不完美,因为基类无法访问新添加的方法。

1.7伴随多态的可替换对象
前期绑定概念
后期绑定概念

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

1.9容器
解决某个特定的问题需要多少个对象,或者他们存活多久的,你是不可能知道的,因为只有在运行时才能获得。
参数化类型,java中称之为泛型。一对尖括号中间包含类型信息,用于从容器中取出对象引用时,记录对象的数据类型,确保向下转型的正确性。

1.10对象的创建和生命周期
java完全采用了动态内存分配方式。
垃圾回收机制知道对象何时不再被使用,并自动释放对象占用的内存。这一点同所有的对象都是单根继承基类Object以及只能以一种方式创建对象相结合,使java变成容易的多。

1.11异常处理:处理错误
异常提供了一种从错误状态进行可靠恢复的途径。现在不再是只有退出程序,你可以经常进行校正,并恢复程序的执行。

1.12并发编程
多个并行任务都要访问同一个资源,就会出现资源共享问题。


对象:拥有行为、状态、标识

将对象作为服务提供者:通过此思想来进行编程

将具体的实现隐藏(通过接口和实现相分离,类内部访问的控制)

复用具体的实现(优先使用组合,后使用继承)

理解is-a跟is-like-a的关系。

多态的实现,可互换的对象(向上转型)java面向对象通过“后期绑定”,当向对象发送消息时,被调用的代码到运行时才能被确定,对存在的方法的参数和返回值执行类型检查(此类语言被称为弱语言),但并不知道确切被执行的代码。

抽象基类和接口:抽象基类的子类必须实现父类的抽象方法,否则继承类仍然是个抽象类。

接口提供了接口与实现的完美分离。

对象的创建、使用和生命周期:java使用堆的内存池来动态地创建对象。生命周期通过垃圾回收器来管理。Garbage collector

Collection与iterator:集合与迭代器,通常被称为容器。通过迭代器来进行统一的选取元素。

采用单根继承结构:这种结构与在堆上创建所有对象,极大地简化了参数传递。所有对象都保证了具有运行时刻类型信息(run time type information),对异常处理及其重要。

向下转型(downcasting)与模板/泛型(template/generic):通过参数化类型来保证向下转型的安全。--C++中通过模板来实现,java通过泛型来实现。

确保正确清楚:java的垃圾回收器来处理内存释放。

垃圾回收与效率和灵活性:java的垃圾回收的不确定性,影响了程序的效率,带来了执行速度前后不一致的问题。

异常处理:java内置了异常处理,强制必须使用它。异常不能被忽略,保证了它必须在某处被处理。

并发:java采用多线程机制来处理并发。通过synchronized关键字来锁定共享资源。

持久性:java的轻量持久性,通过对象序列化(object serialization)或Java数据对象(JDO来实现。

客户端编程/插件plug-in


脚本语言:插件引发了脚本语言的大爆炸

1、问题的复杂性直接取决于抽象的类型和质量,同一个问题,如果抽象的方法不同或质量不同,解决时的复杂性可能有很大差距
2、面向对象思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题
3、面向对象程序设计方式的五个基本特性(最初来自smalltalk)
a、万物皆为对象/Everything is an object.
b、程序是对象的集合,它们彼此通过发送消息来调用对方/A program is a bunch of objects telling each other what to do by sending messages.
c、每个对象都拥有由其它对象所构成的存储/Each object has its own memory made up of other objects.
d、每个对象都拥有其类型(type)/Every object has a type.
e、某一个特定类型的所有对象都可以接收(receive)同样的消息/All objects of a particular type can receive the same messages
[@more@]
4、类:具有相同特性(数据元素)和行为(功能)的对象集合。
5、接口定义了你能够对某一特定对象发出的请求
6、对象应被看作服务提供者
7、访问控制的原因:
a、让客户端程序员(类消费者)无法触及他们不应该触及的部分
b、允许库设计者(类创建者)可以改变类内部的工作方式而不用担心是否会影响到客户端程序员
8、三个访问指定词(access specifier):public、private、protected
9、public:任何人都可以使用;
private:除了类创建者和类的内部方法外,任何人都不能访问;
protected:与private类似,差别在于继承类可以访问父类的protected成员,但不能访问private成员;
还有一种缺省访问权限为package,此权限下,类可以访问在同一个包中的其它类成员,但是在包外,这些成员如同private一样

10、试图访问private成员,会得到编译时错误
11、组合,即使用现有类来合成新的类;聚合,即动态发生的组合;
12、建立新类时,应优先考虑组合,之后才是继承
13、继承一个类而不去重新定义继承到的方法(即不去重载),那么在基类接口中的方法将会被直接继承到导出类中
14、子类与父类相比,没有添加新方法,则称二者关系为"is-a";如果添加了新方法,则为"is-like-a"
15、非面向对象编译器产生函数调用都是使用前期绑定的,即链接器将这个调用解析到将要被执行代码的绝对地址;而在OOP中,程序直到运行时刻才能确定代码的地址,编译时只是确保被调用的方法存在,并对调用参数和返回值执行类型检查(能够提供此类保证的为强类型语言,不能提供的为弱类型语言-weakly typed),但并不知道将会被执行的确切代码。
16、C++中,使用virtual关键字来明确声明希望某个方法使用动态绑定,而缺省状况下不是动态绑定的;在JAVA中,动态绑定是缺省行为
17、abstract关键字把类标识为抽象类,抽象类不能创建对象,否则会产生编译时错误
18、abstract关键字还可以用来描述尚未被实现的方法,即抽象方法,它的含义为:这是一个从此类中继承出的所有类型都具有的接口方法,但是此刻我没有为它设计任何具体实现;抽象方法只能在抽象类内部创建,该类被继承时,抽象方法必须被实现,否则继承类仍然是抽象类(即继承类也必须由abstract关键字修饰,编译器将会检查这一点)。抽象方法的意义在于:你可以将一个方法置于接口中,而不必被迫为此方法提供可能毫无意义的方法体。
19、接口(interface)中不允许有任何方法体定义,即所有方法都是抽象的,但并不需要特别声明abstract关键字,抽象程序的顺序为:普通类<抽象类<接口
20、一般来说在JAVA中,需要多少对象,对象的生命周期,以及对象的具体类型,都要到运行时才能真正确定
21、容器,是一种很有用的概念,也可以说是一种思考方式,对象的个数、类型、生命周期,都可以通过为对象设置容器的方法来控制,简单来说,一个数组就是数组中每个元素的容器。这种方式在各种语言中都被普遍使用,在C++中,容器是标准C++类库(也叫做标准模板类库,Standard Template Library,STL)的一部分
22、List类,列表,用于存储序列;Map类,散列表,也叫作关联数组,用于建立对象之间的关联;Set类,集,用于存储一类对象
23、单根继承结构:所有的类最终都继承自单一的基类,即Object类,所以可以存储Object的容器可以存储任何东西(不包括基本类型)
24、因为有了单根继承结构和通过引用来操作对象的系统特性,垃圾回收器才能够实现
25、我们不知道垃圾回收何时启动并将持续多久,所以同一个JAVA程序的执行速度可能会出现前后不一致的情况,因此在某些强调程序执行速度一致的场合就不能使用它,比如较严格的实时程序
26、JAVA的异常处理是内置的、强制使用的,如果没有编写正确的异常处理代码,将会得到编译时错误
27、异常处理不是面向对象的特征,在面向对象语言出现前,异常处理就已经存在了
28、通常,多线程只是一种为单一处理器分配执行时间的手段,但是如果是在多处理器环境,那么每个线程都可以被指派给不同的处理器,那样才是真正的并行执行;语言级别上多线程的好处之一就是程序员不用关心机器上有多个还是一个处理器
29、Java提供对轻量级持久性(lightweight persistent)的支持,称为轻量级,是因为仍然需要创建显式的调用来执行存储和取回操作,轻量级持久性是通过对象序列化(object serialization)或Java数据对象(JDO,Java Data Object)来实现的
30、客户/服务器系统的核心思想是:系统具有一个中央信息存储池(central repository of information),用来存储某种数据,它通常存在于数据库中,信息与软件的宿主机器(或机器集群)被称为服务器(server),信息可以根据需要被分发给某个人员或机器集群(client)
31、插件,客户端下载一段代码,并将其插入到浏览器中适当的位置,以此来为浏览器添加新功能。
32、脚本语言,可以将客户端程序的源代码直接嵌入到HTML页面中去,解释这种语言的插件在HTML页面被显示时将自动激活(需要浏览器支持此种脚本语言才行),优点是当服务器收到要获取该个页面的请求时,它们可以被快速加载,缺点是这些代码将被暴露给任何人看
33、Java applet胜过脚本语言的优势是,它是以编译过的形式存在的,因此源代码对于客户端来说是不可见的,当然,如果你真的想反编译它,也不需要花费多少力气;注意如果applet编译后很大的话,可能需要额外的时间去下载它,而脚本语言程序是集成到Web页面中的,通常比较小,因此在需要考虑网站相应能力时,应该优先使用脚本语言

猜你喜欢

转载自zhyp29.iteye.com/blog/2305099