您的位置:首页 > 编程语言 > Java开发

thinking in Java --01对象导论

2015-04-04 09:43 190 查看
1.抽象过程:

所有编程语言的最终目的都是提供一种“抽象”方法。解决问题的复杂程度直接取决于抽象的种类及质量。

     汇编语言:   对底层机器的轻微抽象。(汇编语言)

          命令式语言:对汇编语言的一种抽象。(FORTRAN,BASIC和C)

                                 在机器模型(位于“方案空间”)与实际解决的问题模型(位于“问题空间”)之间,程序员必须建立起一种联系。

另一个为机器建模的方法是为要解决的问题制作模型。(LISP和APL)

面向对象的程序设计在此基础上则跨出了一大步,程序员可利用一些工具表达问题空间内的元素。

       将问题空间中的元素以及它们在方案空间的表示物称作“对象”(Object)。

Alan Kay总结了Smalltalk的五大基本特征。这是第一种成功的面向对象程序设计语言,也是Java的基础语言

1)万物皆对象

2)程序是对象的集合,他们通过发送消息来告知彼此要做。

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

4)每个对象都用油漆类型

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

更简洁的描述:

对象是具有状态,行为和标识。

状态---属性

行为---方法

标识---内存中的唯一地址

 

==========================================================

每个对象都有一个接口

       每一个对象都属于定义了特性和行为的某个特定类。

每个对象都提供服务

    对象看做服务的提供者。有助于提高对象的内聚性。

被隐藏具体的实现

   客户端程序员目标:收集各种用来实现快速应用的开发类

   类的创建者目标:构建类

访问控制的原因:

 1.让客户端程序员无法触及他们不应该触及的部分

 2.允许库的设计者可以改变类内部的工作方式而不用担心影响到客户端程序员

内部边界符号:

public        对所有类公开

protected   对本类和子类公开可访问

默认  (包访问权限) 同包下的类可以访问

private   私有,只对本类内部公开

类复用具体实现

1.最简单的办法是仅直接使用那个类的对象。

2.組合 或 聚合

3.继承  (組合优于继承)

继承

使子类与父类产生差异的方法:

1.为子类添加新的方法

2.在子类中改变基类的行为方法(覆盖Overriding )

伴随多态的可互换对象

绑定、前期绑定、后期绑定

绑定:       一个方法的调用与方法所在的类(方法主体)关联起来。

前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。

后期绑定:在运行时根据具体对象的类型进行绑定。

 

在OOP中,程序直到运行时才能够确定代码的地址,所以当消息发送到一个泛华对象时,必须采用其他的机制。

面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用的方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。

必须明确的声明希望某个方法具备后期绑定属性所带来的灵活性。

在这些语言中,方法在默认情况下不是动态绑定的。

而在Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态

静态绑定就是在程序编译时就绑定的.java中的变量都是静态绑定的,方法的话只有static和final(所有private默认是final的)是静态绑定的.

单根继承结构

优点:

所有对象都可以很容易地在堆上创建,而参数传递也得到了极大的简化。

单根继承结构使垃圾回收器的实现变得容易得多,而垃圾回收器正是Java相对C++的重要改进之一。

容器

需要对容器有所选择的两个原因

第一,不同容器提供了不同类型的接口和外部行为。

第二,不同的容器对于某些操作具有不同的效率。

参数化类型

向上转型 是安全

向下转型 有危险  --泛型

对象的创建和生命周期

C++认为效率控制是最重要的议题,所以给程序员提供了选择的权利。为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值。但是,也牺牲了灵活性。

java堆的内存池中动态地创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。这些问题的答案只能在程序运行时相关代码被执行到那一刻才能确定。如果需要一个新对象,可以在需要的时刻直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。

Java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。还有一个议题,就是对象生命周期。对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。

jvm回收垃圾条件:

(1)发现无用信息对象;

(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。

异常处理

1.throws

2.try{}catch{}

finally 解决容错性

并发编程

线程:指进程内的一个执行单元,也是进程内的可调度实体

进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

理解描述:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

区别:

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

java与Internet

cookie与session:

cookie机制采用的是在客户端保持状态的方案

而session机制采用的是在服务器端保持状态的方案。

同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,

所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

 

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。

然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。

浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。

若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。

这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,

不同的浏览器有不同的处理方式session机制。session机制是一种服务器端的机制,

服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id)

如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),

如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,

又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,

这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,

则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,

就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,

以便在表单提交时能够把session id传递回服务器。

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: