概述
java所给予的语言之一smalltalk的五个特征:
1、万物皆为对象2、程序是对象的集合3、每个对象都有自己的由其他对象所构成的存储。4、每个对象都拥有其类型。(每个类最重要的区别于其他类的特性就是“可以发送什么样的消息给它”)5、某一特定类型的所有对象都可以接收同样的消息。
对象具有状态(拥有内部数据)、行为(产生行为)和标识(可以和其他对象区分开来)
当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”。目标就是去创建(最好是在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。
把服务看作诗服务提供者还有一个好处:它有助于提高对象的内聚性。高内聚是软件设计的基本质量要求之一。
这意味着一个软件构件的各个方面“组合”得很好。
在良好地面向对象设计中,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。
将程序开发人员按照角色分为类创建者和客户端程序员。客户端程序员的目的是收集各种用来实现快速开发的类。类创建者的目标是构建类,这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。对于隐藏的部分客户端程序员将不能够访问它,这部分通常代表对象内部脆弱的部分,很容易被粗心的或不知内情的客户端程序员所毁坏,因此隐藏这部分可以减少程序bug。
相互关系很重要,当创建一个类库时,就建立了与客户端程序员之间的关系,他们同样是程序员,但是他们是使用你的类库来构建应用、或者构件更大的类库的程序员。
访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分。(这对客户端程序员来说其实是一项服务,因为他们可以很容易地看出哪些东西对他们来说很重要,哪些可以忽略)第二个原因就是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。
JAVA用三个关键字在类的内部设定边界:public、private、protected。这些访问指定词决定了紧跟其后被定义的东西可以被谁使用。
public:表示紧随其后的元素对任何人都是可用的。
private:除类型创建者和类型的内部方法之外的任何人都不能访问的元素。
protected:继承的类可以访问,但是不能访问private成员。
JAVA还有一种默认的访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用。这种权限通常被称为包访问权限,在这种权限下,类可以访问在同一个包中的其他类的成员,但在包之外如同指定了private一样。
代码复用很难被实现,但是代码复用是面向对象编程设计语言所提供的最了不起的优点之一。
使用现有的类合成新的类,所以称为组合。如果组合是动态发生的,那么他通常被称为聚合。
组合带来极大地灵活性,新类的成员对象通常都被声明为private
继承在面向对象很重要,所以被高度强调,作为新手会处处都应该使用继承,这回导致难以使用并过分复杂的设计。
当继承现有类型时,就创造了新的类型,这个新的类型不仅包含这个类型的所有成员(尽管private),而且重要的是它复制了基类的借口。即:所有可以发送给基类对象的消息同时也可以发送给导出类的对象。由于通过发送给类的消息的类型可知类的类型。所以也就意味着导出类与基类具有相同的类型。
面向对象程序设计的最重要的妙诀:编译器不可能产生传统意义上的函数调用。
1、非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。
2、面向对象编程的编译器产生的函数调用会引起所谓的后期绑定,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用的方法的存在,并对调用参数和返回值执行类型检查,但是并不知道被执行的确切代码。
为了执行后期绑定,JAVA使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。,根据这一小段代码的内容,每个对象都可以有不同的行为表现。当向一个对象发送消息时,该对象就能够知道对这条消息应该做些什么。
在OOP中,除了C++以外的所有OOP语言,所有的类最终都继承自单一的基类,这个基类叫Object,事实证明,单根继承结构带来了很多好处。
在单根继承结构中的所有对象都具有一个共用接口,所以它们归根到底都是相同的基本类型,而另一种(C++提供的)结构无法确保所有对象都属于同一个基本类型。
单根继承结构保证所有对象都具备某些功能
单根继承结构使垃圾回收器的实现变得容易多。
好的OOP语言都有一组容器,它们作为开发包的一部分。在C++中,容器(也称集合)是标准C++类库的一部分,被称为标准模版类库。
JAVA在其标准类库中也包含有大量的容器。
从设计的观点来看,真正需要的只是一个可以被操作,从而解决问题的序列,如果单一类型的容器可以满足所有需要,那么就没有理由设计不同种类的序列了,然而换需要对容器有所选择。有两个原因1、不同容器提供了不同类型的接口和外部行为。2、不同容器对于某些操作具有不同的效率。
在JAVA SE5出现之前,容器存储的对象都只具有JAVA中的通用类型:Object。单根继承结构意味着所有东西都是Object类型,所以可以存储Object的容器可以存储任何东西,这使得容器很容易被复用。
JAVA SE5的重大变化之一就是增加了参数化类型,在JAVA中它成为范型。一对尖括号,中间包含类型信息。通过这些特征就可以识别对范型的使用。
在使用对象时,最关键的问题之一是他们的生存和销毁方式。
继承最终会以创建一系列累收场,所有的类都是建立在同意的接口基础上。
从技术角度说,OOP(面向对象程序设计)只是涉及到数据类型、继承以及多形性,但是换有另外一些问题也很重要。如:对象的创建及破坏方式(对象所需要的数据位于哪儿,如何控制对象的“存在时间”)
解决方法1、C++认为程序的执行效率是最重要的一个问题,所以它允许程序员做出选择。为了获得更快的运行速度,存储以及存在时间可在编写程序时决定,只需要将对象放置在堆栈,或静态存储区域即可。
2、在一个内存池(亦叫堆或者内存堆)中动态创建对象,若采用这种方式,除非进入运行期,否则根本不知道到底需要多少个对象,也不知道它们的存在时间有多长,以及准确的类型是什么。这些参数都在程序正式运行时才决定的。若需一个新对象,只需在需要它的时候在内存堆里简单地创建它即可。
在堆栈里创建存储空间只需要一个简单的指令将堆栈指针向下或向下移动即可。
C++允许我们决定是在写程序时创建对象,还是在运行期间创建,这种控制方法更加灵活。
程序员可以用两种方法来破坏一个对象:用程序化的方式决定何时破坏对象。或者利用运行环境提供的一种“垃圾收集器”特征,自动寻找那些不再使用的对象,并将其清除。
垃圾收集器显然方便的多,但要求所有应用程序都必须容忍垃圾收集器的存在,并能默许随垃圾收集带来的额外开销。但是这并不符合C++语言的设计宗旨,所以未能包含到C++里。但JAVA确实提供了一个垃圾收集器(smalltalk也有这样的设计,尽管Deliphi默认没有垃圾收集器,但可选择安装)。
对象生命周期:对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。然而,如果是在堆上创建对象,那么编译器就会对他的生命周期一无所知。
异常处理就像是与程序正常执行路径并行的、在错误发生时执行的另一条路径,因为他是另一条完全分离的执行路径,所以它不会干扰正常的执行程序。
异常提供了一种从错误状况进行可靠恢复的途径。现在不再是之恩能够退出程序,你可以经常进行校正,并恢复程序的执行,这些都有助于编写出更健壮的程序。
异常处理不是面向对象的特征。在面向对象语言出现之前就已经存在了。
JAVA一开始就内置了异常处理,而且强制你必需使用它。它是唯一可以接受错误报告方式,如果没有编写正确的处理异常的代码,那么就会得到一条编译时的出错消息。
许多程序设计要求,程序能够停下正在做的工作,转而处理某个其他问题,然后再返回主进程。主进程的挂起是通过硬件中断来触发的,难度太大。编程中有一个基本概念,就是在同一时刻处理多个任务思想叫做并发编程。(多线程并发)
最常见的例子就是用户界面,通过使用用户可以按下按钮后快速得到一个响应,而不用被迫等待程序完成当前任务为止。
线程是一种为单一处理器分配执行时间的手段。如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,并且它们是真正的并行执行。
并发看起来简单,但是有一个隐患:共享资源。如果多个并行任务都要访问同一项资源,那么就会出问题。
例如两个进程不能同时向打印机发送信息。为了解决这个问题可以共享资源,打印机必需在使用期间被锁定,因此,某个任务锁定某项资源,完成其任务,然后释放资源锁,使其它任务可以使用这项资源。
JAVA的并发是内置于语言中的,JAVA SE5已经增添了大量额外的库支持。
客户/服务器系统的核心思想是:系统具有一个中央信息存储器,用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人员或机器集群。
客户/服务器的概念关键在于信息存储池的位置集中于中央。
信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息,然后将它们显示在被称为客户机的用户机器上。
问题是只有单一的服务器,却要同时为多个客户服务。这会涉及数据库管理系统,因此设计者把数据“均衡”分布于数据表中,以取得最优的使用效果。此外,系统通常允许客户在服务器中插入新的信息,这意味着必须保证一个客户插入的新数据不会覆盖另一个客户插入的新数据,也不会将其添加到数据库的过程中丢失,这被称为事务处理。
因为可能在任意时刻都有成百上千的客户向服务器发出请求,为了将延迟最小化,程序员努力减轻处理任务的负载,通常是分散给客户端机器处理,但有时也会使用所谓的中间件将负载分散给在服务器端的其他机器。(中间件也被用来提高可维护性)
Web就是一台巨型客户/服务器系统,但是稍微差点,因为所有的服务器和客户机都同时共存于同一个网络中。。我们需要关心的事在某一时刻怎样连接到一台服务器上,并与之进行交互。
最初只有一种很简单的单向过程:你对某个服务器产生一个请求,然后它返回给你一个文件,你的机器上的浏览器软件根据本地机器的格式来解读这个文件。人们希望实现完整的客户/服务器能力,使得客户可以将信息反馈给服务器。这正是Web发展过程。
Web的进步:一段信息不经修改就可以再任意型号的计算机上显示。
浏览器只是一个观察器,它甚至不能执行最简单的计算任务。另一方面,它却是安全的,因为它在本地机器上不会执行任何程序。
Web最初的“服务器-浏览器”设计是为了能够提供交互性的内容,但其交互性完全由服务器提供。服务器产生静态页面,提供给只能解释并显示它们的客户端浏览器。基本的HTML包含有简单的数据收集机制:文本输入框、复选框、单选框、列表和下拉式列表以及按钮——它只能被编程来实现复位表单上的数据或提交表单上的数据给服务器。这种提交动作通过所有的Web服务器都提供的通用网关接口(CGI)传递。
许多最有影响力的网站完全构建于CGI之上,实际上你可以通过CGI做任何事,然而构建于CGI程序之上的网站可能会迅速变得过于复杂而难以维护,并同时产生响应时间过长的问题。CGI程序的响应时间依赖于所必须发送的数据量的大小,以及服务器和Internet的负载。
任何形式的动态图形处理几乎都不可能连贯地执行,因为图形交互格式(GIF)的文件必须在服务器端创建每个图形版本,并发送给客户端。
对Web输入表单进行数据验证的过程:按下网页上提交按钮,数据被发送回服务器,服务器启动一个CGI程序来检查、发现错误,并将错误组装为一个HTML页面,然后将这个页面发回给你之后你必需回退一个页面,然后重新再试。解决问题的方法就是客户端编程。使得返回给用户的结果更加迅捷,而且使得你的网站更加具有交互性。
客户端编程的问题是:它与通常意义上的编程不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。
客户端编程:
1、插件;客户端编程迈出的最重要的一步就是插件的开发。通过这种方式,程序员可以下载一段代码,并将其插入到浏览器适当的位置,以此来为浏览器添加新功能。
插件对于客户端编程的价值在于:它允许专家级的程序员不需要经过浏览器生产厂商的许可,就可以开发某种语言扩展,并将它们添加到服务器中。因此“插件”提供了一个后门,使得可以创建新的客户端编程语言。(并不是所有客户端编程语言都是以插件的形式实现的。)
2、脚本语言;
插件引发了浏览器脚本语言的开发。通过使用某种脚本语言,你可以以客户端程序的源代码直接嵌入到HTML中,解释这种语言的插件在HTML页面被显示时自动激活。脚本语言相当易于理解,因为他们只是作为HTML页面一部分的简单文本,当服务器收到要获取该页面的请求时,他们可以被快速加载。缺点是代码会暴露给任何人去浏览(或窃取),但是通常不会使用脚本语言去做相当复杂的事情,所以这个缺点不严重。
有一种脚本语言在Web浏览器上不需要任何插件的情况下就可以得到支持,那么它一定是Javascript(它与java之间只存在表面的相似,它之所以这样命名只是因为想赶上JAVA潮流)
脚本语言可以解决客户端编程中所遇到的百分之八十问题。
3、JAVA;
JAVA是通过applet以及使用JAVA Web Start 来进行客户端编程。
applet是只在Web浏览器中运行的小程序,它作为网页的一部分而自动下载的,当applet被激活时,它便开始执行一个程序,这正是它的优雅之处,它提供一种分发软件的方法,一旦用户需要客户端软件时,就会自动从服务器把客户端软件分发给用户。
4、备选方案;
java applet 始终没有得到大规模应用,最大的问题在于安装java运行时环境(JRE)所必需的10MB带宽。而微软没有选择在IE中包含JRE这一事实也许就此封杀了applet的命运。
5、.NET和C#;与java展开客户端编程的竞争
.NET平台大致相当于java虚拟机(JVM,即执行java编程的软件平台)和java类库,而C#毫无疑问与java有类似之处。
6、Internet与Intranet
Web是最常用的解决客户/服务器问题的方案。当Web技术仅限于用于特定公司的信息网络时,它就被称为Intranet(企业内部网)
最后
以上就是凶狠诺言为你收集整理的常见的Java编程思想有哪些的全部内容,希望文章能够帮你解决常见的Java编程思想有哪些所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复