1.1抽象过程
1
.人们所能够解决问题的复杂性直接取决于抽象的类型和质量。
2.java语言的五个基本特性:
1)万物皆为对象,2)程序是对象的集合,他们通过发送消息来告知彼此所要做
的,3)每个对象都有自己的由其他对象所构成的存储,4)每个对象都拥有其类型,5)某个特定类型的所
有对象都可以接受同样的消息。
1.2 每个对象都有一个接口
1.对象是唯一的,但是具有相同的特性和行为的对象所归属类的一部分。
2.类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型。
3.每个对象都只能满足某些请求,这些请求由对象的接口所定义,决定接口的便是类型。
1.3 每个对象都提供服务
1.在试图开发过理解一个程序的时候,最好的方法之一就是将对象想像为 “服务提供者”,程序本身向用户提
供服务。
2.将对象看为服务者还有一个好处,可以提高对象的内聚性。高内聚是软件设计的基本 质量要求之一。
3.人们在设计对象是面临的一个问题是,将过多的功能都塞在一个对象中。
1.4 被隐藏的具体实现
1.程序开发人员按照角色分为“类创建者”(那些创建新数据类型的程序员)和“客户端程序员”(那些在其应用中使用数据类型的类消费者)。
2.客户端程序员的目标是搜集各种用来快速应用开发的类。
3.类创建者的目标是构建类,这种类只向客户端程序员暴露必需部分,而隐藏其他部分。
4.访问控制的原因:
1 ) 让客户端成员无法触及他们不应该触及的部分。
2)允许库设计这可以改变类内部的工作方式而不用担心会影响到客户端程序员。(接口和实现可以清晰的分离并加以保护)
5.Java的三个关键字在类内部的设定边界:
1)public表示其后的元素对任何人都是可用的。
2)private表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。
3)protect与privite作用相当,差别仅在与继承的类可以访问protect成员,但是不能访问private成员。
1.5 复用具体实现
1.最简单的复用某个类的方式就是直接使用该类的一个对象。
2.在现有的类合成新的类,这种该念被称为组合,如果组合是动态发生的,那么它通常被称为聚合,被视为拥有关系。
3在创建新类的时候,应该首先考虑组合,如果采用这种方式,设计会变的更加清晰,一旦有了一些经验之后,便能够
看出使用继承的场合了。
1.6 继承
1.基类型和导出类型之间具有相似性。
2.基类型包含了其所有导出类型所共享的特性和行为。可以创建一个类型来表示系统中某些对象
3.新的类型不光包含了现有类型的所有成员,更重要的是它复制了基类的接口,所有发送给基类的消息可以同时发送给导出对象。
4.使基类型与导出类型产生不同的两种方法:1)直接才导出类中加添新的方法,这些方法并不是基类接口的一部分。
2)改变现有基类的方法的行为,被称之为覆盖那个方法,此时,正在使用相同的接口方法,但是可以在新方法下做不同的事情。
5.导出类型在对基类型的方法添加上产生两种效果,一种是覆盖了基类的方法,意味着导出类和基类是完全相同的类型,因为他们具有
完全相同的接口,2)在对基类的方法上添加新的方法,
扩展了接口,
虽然这种代替不完美,因为基类型无法访问新添加的方法。
1.7 伴随多态的可交互对象
1.在导出新的子类型是,不需要修改处理泛化基类型的方法,通过导出新的子类型而轻松扩展设计是一种非常好的能力。
2.编程时方法操作的泛化(即针对基类型进行方法的行为)可以极大的改善设计,降低维护的代价。
3.面向对象编程的妙诀:一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器将产生对一个具体函数
名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址,而在OOP中,程序直到运行时才能够确定代码的地址
,面向
对象编程语言使用了后期绑定的概念,当向对象发送消息时,被调用的代码直到执行时才能确定,编译
器确保被调用方法的存在,并
对调用函数参数和返回值执行类型检查(无法提供此类保证的语言被称为弱类型的),但是不知道将被
执行的确切代码,所以为了执
行后期绑定,Java使用了一小段特殊的代码来替代绝对地址的调用,这段代吗使用在对象中存储的信息来计算方法的具体地址,这样
根据这段代码的内容,每个对象都可以具有不同的行为表现,当向一个对象发送消息时,该对象就能够知道这道对这条消息应该做什
么。
4在Java中,动态绑定是默认的行为,不需要添加额外的关键字来实现多态,而在C++中则是通过virtual关键字来实现的。
5为了说明多态,我们需要写一段代码,它忽略类型的具体细节,仅仅和基类交互,这段代吗和具体类型信息是分离的,这样做使代码编
写更为简单也更易于理解,可扩展性是极好的。
1.8 单根继承结构
1.自从c++面世以来,所有的OOP语言(除C++以外)所有的类最终都继承自单一的基类。
2.在单根继承结构中的所有对象都具有一个共用接口,所以他们归根到底是相同的基本类型。而C++所提供的结构是无法确保所有对象
都属于同一个基本类型,(这么做可以更好的向后兼容C模型,而且受限制少,但是当要进行完全的面向对象程序设计时,则必须构
建自己的继承体系,使得他可以利用OOP语言内置的遍历)
3.单继承结构的优点:1)保证所有对象具备某些功能。(你可以在每个对象上执行某些基本操作)
2)所有的对象可以很容易的在堆上创建。
3)参数传递可以得到极大的简化。
4)单根继承结构使垃圾回收器的实现变得容易的多(垃圾回收器正式Java对于C++所做的重要改进之一)
5)由于所有的对象都具有其类型信息,因此不会因无法确定对象的类型而陷入僵局,(这对于系统级操作
(如异常处理)闲的尤其重要,并且给编程带来了更大的灵活性)
1.9容器
1.解决某个特定问题时,Java中提供了创建另一种对象类型,这种新的对象类型持有对其他对象的引用,(也可以使用数组)
我们称之为“容器”的新对象,然后让它来处理所有的细节(任何需要时都可以扩充自己以容纳你置于其中的所有东西,因此不需
要知道将来会把多少个对象置于这个容器中)。
2.在许多语言中都有专门的容器来进行处理,有通用的一些容器,但是许多时候还是要容器有所选择
1)不同容器提供了不用类型的外部接口和行为。(堆栈相比较于队列)(集合相比较于列表)
2)不同的容器对于某些操作具有不同的效率。(Arraylist随机访问花费的时间是固定的,Linkedlist则是不同的)
1.9.1参数化类型
1.JAVA SE5出现之前,容器存储的对象都只是具有Java中的通用类型:object,单根继承结构意味着所有东西都是object类型,
所以可以存储object的容器可以存储任何东西。这使得容器很容易被复用.
2.参数化类型在Java中也称为范型):它知道自己所保存的类型机制,从而不需要向下转型,是一个编译器可以自动的定制作用于
特定类型上的类,一对尖括号,中间包含类型的信息。
1.10对象的创建和生命期
1.C++认为效率控制是最重要的,为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序的时确定,这可以通过
将对象置于堆栈或静态存储区域内来实现,同样也牺牲了灵活性。
2.第二种在被称为堆的内存池中动态的创建对象,直到运行时才知道需要多少对象,生命周期如何,具体类型是什么,因为存储空间
是在运行时被动态管理的,所以需要大量时间在堆中分配存储空间,可能要远远大于在堆栈中创建存储空间的时间。
3.Java完全采用了动态内存分配方式,每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。
4.对象的生命周期,对于允许在堆栈上创建对象的语言,Java 编译器可以确定对象存活的时间,并可以自动销毁它(垃圾回收机制)
而对于C++来说,必须通过编程来确定何时销毁对象,这可以因为不正确的处理而导致内存泄露(C++的常见问题),相比而言,
垃圾回收机制减少了所必须考虑的议题和编写的代码。
1.11异常处理:错误处理
Java的异常处理就像是与程序正常执行路径并行的,因为它是一条完全分离的执行路径,所以它不会干扰正常的执行代码,异常提供
了一种从错误状况进行可靠恢复的途径,现在不再是只能退出程序,你可以经常进行校正,并恢复程序的执行,这些都有助于编写出
更健壮的程序。(注意:异常处理在面向对象编程语言出现之前就已经存在了)。
1.12并发程序
1.程序中,彼此独立 运行的部分被称为线程。
2.并发:在同一时刻处理多个任务的思想。
3.在共享资源上,Java也提供了资源锁。
1.13Java与Internet
1.客户/服务器计算技术,.信息存储池:用于分发信息的软件以及信息与软件所驻留的机器或者机群被总称为服务器。