"景先生毕设|www.jxszl.com

java 编程思想

2023-09-12 15:40编辑: www.jxszl.com景先生毕设
                       java 编程思想
1多线程
在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手
头的工作,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些
拥有机器低级知识的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这
是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。
有些时候,中断对那些实时性很强的任务来说是很有必要的。但还存在其他许多问题,它们只要求将问题划
分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。在一个程序中,这些独立运行的片
断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用
户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任
务以后才开始响应。
最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器,那么
每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程操
作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线
程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。
根据前面的论述,大家可能感觉线程处理非常简单。但必须注意一个问题:共享资源!如果有多个线程同时
运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个进程不能将信息同时发送给
一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状
态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用
同样的资源。
Java 的多线程机制已内建到语言中,这使一个可能较复杂的问题变得简单起来。对多线程处理的支持是在对
象这一级支持的,所以一个执行线程可表达为一个对象。Java 也提供了有限的资源锁定方案。它能锁定任何
对象占用的内存(内存实际是多种共享资源的一种),所以同一时间只能有一个线程使用特定的内存空间。
为达到这个目的,需要使用synchronized 关键字。其他类型的资源必须由程序员明确锁定,这通常要求程序
员创建一个对象,用它代表一把锁,所有线程在访问那个资源时都必须检查这把锁。

2 永久性
创建一个对象后,只要我们需要,它就会一直存在下去。但在程序结束运行时,对象的“生存期”也会宣告
结束。尽管这一现象表面上非常合理,但深入追究就会发现,假如在程序停止运行以后,对象也能继续存
在,并能保留它的全部信息,那么在某些情况下将是一件非常有价值的事情。下次启动程序时,对象仍然在
那里,里面保留的信息仍然是程序上一次运行时的那些信息。当然,可以将信息写入一个文件或者数据库
从而达到相同的效果。但尽管可将所有东西都看作一个对象,如果能将对象声明成“永久性”,并令其为我
们照看其他所有细节,无疑也是一件相当方便的事情。
Java 1.1 提供了对“有限永久性”的支持,这意味着我们可将对象简单地保存到磁盘上,以后任何时间都可
取回。之所以称它为“有限”的,是由于我们仍然需要明确发出调用,进行对象的保存和取回工作。这些工
作不能自动进行。在Java 未来的版本中,对“永久性”的支持有望更加全面。

3名字的可见性
有程序设计语言里,一个不可避免的问题是对名字或名称的控制。假设您在程序的某个模块里使用了一个名字,
而另一名程序员在另一个模块里使用了相同的名字。此时,如何区分两个名字,并防止两个名字互相冲突呢?这个问题在 C 语言里特别突出。
因为程序未提供很好的名字管理方法。C++的类(即 Java 类的基础)嵌套使用类里的函数,使其不至于同其他类里的嵌套函数名冲突。
然而,C++仍然允许使用全局数据以及全局函数,所以仍然难以避免冲突。为解决这个问题,C++用额外的关键字引入了“命名空间”的概念。
由于采用全新的机制,所以Java 能完全避免这些问题。为了给一个库生成明确的名字,采用了与Internet域名类似的名字。事实上,
Java 的设计者鼓励程序员反转使用自己的Internet 域名,因为它们肯定是独一无二的。由于我的域名是BruceEckel.com,
所以我的实用工具库就可命名为com.bruceeckel.utility.foibles。反转了域名后,可将点号想象成子目录。在Java 1.0 和 Java 1.1 中,
域扩展名 com,edu,org,net 等都约定为大写形式。所以库的样子就变成:COM.bruceeckel.utility.foibles。然而,在 Java 1.2 的开发过程中
,设计者发现这样做会造成一些问题。所以目前的整个软件包都以小写字母为标准。Java 的这种特殊机制意味着所有文件都自动存在于自己的命名空间里。
而且一个文件里的每个类都自动获得一个独一无二的标识符(当然,一个文件里的类名必须是唯一的)。所以不必学习特殊的语言知识来解决这个问题——
语言本身已帮我们照顾到这一点。

4 执行控制
Java 使用了 C 的全部控制语句,所以假期您以前用C 或 C++编程,其中大多数都应是非常熟悉的。
大多数程序化的编程语言都提供了某种形式的控制语句,这在语言间通常是共通的。
在Java 里,涉及的关键字包括if-else、while、do-while、for 以及一个名为 switch 的选择语句。
然而,Java 并不支持非常有害的goto(它仍是解决某些特殊问题的权宜之计)。仍然可以进行象goto 那样的跳转,但比典型的 goto 要局限多了。

5 克隆的控制
为消除克隆能力,大家也许认为只需将clone()方法简单地设为private(私有)即可,但这样是行不通的,因为不能采用一个基础类方法,
并使其在衍生类中更“私有”。所以事情并没有这么简单。此外,我们有必要控制一个对象是否能够克隆。对于我们设计的一个类,
实际有许多种方案都是可以采取的:(1) 保持中立,不为克隆做任何事情。也就是说,尽管不可对我们的类克隆,但从它继承的一个类却可根据实际情况决定克隆。
只有Object.clone()要对类中的字段进行某些合理的操作时,才可以作这方面的决定。(2) 支持clone(),采用实现 Cloneable(可克隆)能力的标准操作,
并覆盖 clone()。在被覆盖的 clone()中,可调用 super.clone(),并捕获所有违例(这样可使 clone()不“掷”出任何违例)。(3) 有条件地支持克隆。
若类容纳了其他对象的句柄,而那些对象也许能够克隆(集合类便是这样的一个例子),就可试着克隆拥有对方句柄的所有对象;如果它们“掷”出了违例,
只需让这些违例通过即可。举个例子来说,假设有一个特殊的 Vector,它试图克隆自己容纳的所有对象。编写这样的一个 Vector 时,
并不知道客户程序员会把什么形式的对象置入这个 Vector 中,所以并不知道它们是否真的能够克隆。(4) 不实现 Cloneable(),但是将clone()覆盖成 protected,
使任何字段都具有正确的复制行为。这样一来,从这个类继承的所有东西都能覆盖clone(),并调用 super.clone()来产生正确的复制行为。注意在我们实现方案里,
可以而且应该调用super.clone()——即使那个方法本来预期的是一个 Cloneable 对象(否则会掷出一个违例),因为没有人会在我们这种类型的对象上直接调用它。
它只有通过一个衍生类调用;对那个衍生类来说,如果要保证它正常工作,需实现Cloneable。(5) 不实现 Cloneable 来试着防止克隆,并覆盖clone(),
以产生一个违例。为使这一设想顺利实现,只有令从它衍生出来的任何类都调用重新定义后的 clone()里的suepr.clone()。(6) 将类设为final,
从而防止克隆。若clone()尚未被我们的任何一个上级类覆盖,这一设想便不会成功。若已被覆盖,那么再一次覆盖它,并“掷”出一个
 CloneNotSupportedException(克隆不支持)违例。为担保克隆被禁止,将类设为final 是唯一的办法。除此以外,
一旦涉及保密对象或者遇到想对创建的对象数量进行控制的其他情况,应该将所有构建器都设为private,并提供一个或更多的特殊方法来创建对象。

原文链接:http://www.jxszl.com/biancheng/JAVA/446471.html