常见的Java编程思想有哪些
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已经增添了⼤量额外的库⽀持。
客户/服务器系统的核⼼思想是:系统具有⼀个中央信息存储器,⽤来存储某种数据,它通常存在于数
据库中,你可以根据需要将它分发给某些⼈员或机器集。
客户/服务器的概念关键在于信息存储池的位置集中于中央。
信息存储池、⽤于分发信息的软件以及信息与软件所驻留的机器或机被总称为服务器。驻留在⽤户机器上的软件与服务器进⾏通信,以获取信息、处理信息,然后将它们显⽰在被称为客户机的⽤户机器上。
问题是只有单⼀的服务器,却要同时为多个客户服务。这会涉及数据库管理系统,因此设计者把数据“均衡”分布于数据表中,以取得最优的使⽤效果。此外,系统通常允许客户在服务器中插⼊新的信息,这意味着必须保证⼀个客户插⼊的新数据不会覆盖另⼀个客户插⼊的新数据,也不会将其添加到数据库的过程中丢失,这被称为事务处理。
java面向对象的特征有哪些方面因为可能在任意时刻都有成百上千的客户向服务器发出请求,为了将延迟最⼩化,程序员努⼒减轻处理任务的负载,通常是分散给客户端机器处理,但有时也会使⽤所谓的中间件将负载分散给在服务器端的其他机器。(中间件也被⽤来提⾼可维护性)
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(企业内部⽹)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论