《网上书店管理系统外文资料翻译.doc》由会员分享,可在线阅读,更多相关《网上书店管理系统外文资料翻译.doc(18页珍藏版)》请在三一办公上搜索。
1、毕业设计(论文)外文资料翻译系 : 信息工程学院 专 业: 计算机科学与技术 姓 名: xxxxxx 学 号: xxxxxxxxx (用外文写)外文出处: Thinking.In.Java.4th.Edition 附 件: 1.外文资料翻译译文;2.外文原文。 指导教师评语: 签名: 2011年 月 日附件1:外文资料翻译译文一切都是对象“如果我们说另一种不同的语言,那么我们就会发觉一个有些不同的世界”。Ludwig Wittgenstein(1889-1951)“尽管以C+为基础,但Java是一种更纯粹的面向对象程序设计语言”。 无论C+还是Java都属于杂合语言。但在Java中,设计者觉得
2、这种杂合并不像在C+里那么重要。杂合语言允许采用多种编程风格;之所以说C+是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C+是C的一个超集,所以包含的许多特性都是后者不具备的,这些特性使C+在某些地方显得过于复杂。 Java语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他OOP语言相比,才能体会到Java的易学易用。在本章,我们将探讨Java程序的基本组件,并体会为什么说Java乃至Java程序内的一切都是对象。1.1 用句柄操纵对象每种编程语言都有
3、自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C+里的指针)?所有这些在Java里都得到了简化,任何东西都可看作对象,。因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的
4、是遥控板(句柄),再有遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所以如果想容纳一个词或句子,可创建一个String句柄:String s;但这里创建的只是句柄,并不是对象。若此时向s发送一条消息,就会获得一个错误(运行期)。这是由于s实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化:String s = “zyp”;然而,这里用到了Java语言的一个特性:字
5、串可以用加引号的文本初始化。通常,必须为对象使用一种更通用的初始化方法。1.2 有对象都必须创建创建句柄时,我们希望它用一个新对象连接。通常用new关键字达到这一目标。New的意思是:“把我变成这些对象的一种新类型”。所以在上面的例子中,可以说:String s = new String(“asdf”);它不仅指出“给我一个新的字符串”,也通过提供一个初始字符串,指出了“如何生成这个新字串”。 当然,字串(String)并非唯一的类型。Java配套提供了数量众多的现成类型。对我们来讲,最重要的就是记住能自行创建类型。事实上,这应是Java程序设计的一项基本操作,是继续本书后余部分学习的基础。1
6、.2.1 存储到什么地方程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:(1)寄存器。这是最快的保存区域,因为它位于不同于其他存储区的地方处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹(另一方面,C和C+允许您向编译器建议寄存器的分配方式)。(2)堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅
7、次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里特别是对象句柄,但Java对象并不存储于其中。(3)堆。一种通用的内存池(也在RAM区域),用于存放所有的Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需要用new命令编制相关的代码即可。执行这些代码时,
8、会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然付出一定的代价:在堆里分配存储空间时会花掉更长的时间(如果确实可以在Java中像在C+中一样在栈中创建对象)。(4)常量存储。常数值通常直接置于程序代码内部。这样做是安全的,因为他们永远都不会改变。有的常数需要严格地保护,所以可考虑将他们置入只读存储器(ROM)。(5)非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最重要的例子便是“流式对象”和“持久化对象”。对于流式对象,对象会转化成字节流,通常会发给另一台机器。而对于持久化对象,对象保存在磁盘中。即使程序中止运行,他们仍可保持自己的
9、状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将他们恢复成普通的、基于RAM的对象。Java 提供了对轻量级持久化的支持,而诸如JDBC和Hibernate这样的机制提供了更加复杂的对数据库中存储和读取对象信息的支持。1.2.2 特例:基本类型在程序设计中经常用到一系列类型,他们需要特殊对待。可以把他们想像成“基本”类型。之所以特殊对待,是因为new将对象存储在“堆”里,故用new创建一个对象特别是小的、简单的变量,往往不是很有效。因此,对于这些类型,Java采取与C和C+相同的方法。也就是说,不用new来创建变量,而是创建一个并非是引用的“自
10、动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。Java要确定每种基本类型所占存储空间的大小。他们的大小并不像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是Java程序比用其他大多数语言编写的程序更具可移植性的原因。所有数值类型都有正负号,所以不要去寻找无符号的数值类型。Boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false。基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。例如:Char c = x;Character ch = new Character(c);也可以这样用:Ch
11、aracter ch = new Character(x);包装基本类型的原因将在以后的章节中说明。高精度数字Java提供了两个用于高精度计算的类:BigInteger 或 BigDecimal。虽然它们大体上属于“包装器类”的范畴,但二者都没有对应的基本类型。不过,这两个类包含的方法,提供的操作与对基本类型所能执行的操作相识。也就是说,能作用于int或float的操作,也能作用于BigInteger或Big Decimal。只不过必须以方法调用方式取代运算符方式来实现。由于这么做复杂了许多,所以运算速度会比较慢。在这里,我们以速度换取了精度。BigInteger支持任意精度的整数。也就是说,
12、在运算中,可以准确地表示任何大小的整数值,而不会丢失任何信息。BigDecimal支持任何精度的定点数,例如,可以用它进行精确的货币计算。关于调用这两个类的构造器和方法的详细信息,请查阅JDK文档。1.2.2 Java中的数组几乎所有的程序设计语言都支持数组。在C和C+中使用数组是很危险的,因为C和C+中的数组就是内存块。如果一个程序要访问其自身内存块之外的数组,或在数组初始化前使用内存(程序中常见的错误),都会产生难以预料的后果。Java的主要目标之一是安全性,所以许多在C和C+里困扰程序员的问题在Java里不会再出现呢。Java确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检查
13、,是以每个数组上少量的内存开销及运行时的下标检查为代价的。但由此换来的是安全性和效率的提高,因此付出的代价是值得的(并且Java有时可以优化这些操作)。当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。因此,常犯的数组错误在Java中就可以避免。还可以创建用来存放基本数据类型的数组。同样,编译器也能确保这种数组的初始化,因为它会将这种数组所占的内存全部置零。数组将在以后的
14、章节中详细讨论。1.3永远不需要销毁对象 在大多数程序设计语言中,变量生命周期的概念,占据了程序设计工作中非常重要的部分。变量需要存活多长时间?如果想要销毁对象,那什么时刻进行呢?变量生命周期的混乱往往会导致大量的程序bug,本节将介绍Java是怎样替我们完成所有的清理工作,从而大大简化这个问题的。1.3.1 作用域大多数过程型语言都有作用域(scope)的概念。作用域决定了在其内定义的变量名的可见性和生命周期。在C、C+和Java中,作用域由花括号的位置决定。例如:int x = 12; /Only x availableint q = 96; /both x & q available/o
15、nly x available/q is “out of scope”在作用域里定义的变量只可用于作用域结束之前。任何位于“/”之后到行末的文字都是注释。缩排格式使Java代码更易于阅读。由于Java是一种自由格式(free-form)的语言,所以,空格、制表符、换行都不会影响程序的执行结果。尽管以下代码在C和C+中是合法的,但是在Java中却不能这样写:int x = 12;int x = 96; /illegal编译器将会报告变量x已经定义过。所以,在C和C+里将一个较大作用域的变量“隐藏”起来的做法,在Java里是不允许的。因为Java设计者认为这样做会导致程序混乱。1.3.2 对象的作
16、用域Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。所以假如你采用代码String s = new String(“a string”);/ End of scope引用s在作用域终点就消失了。然而,s指向的String对象仍继续占据内存空间。在这一小段代码中,我们无法在这个作用域之后访问这个对象,因为对它唯一的引用已超出了作用域的范围。在后继章节中,读者将会看到:在程序执行过程中,怎样传递和复制引用。事实证明,由new创建的对象,只要你需要,就会一直保留下去。这样,许多C+编程问题在Java中就完全消失了。在C+中,你不仅必须要确保对象的
17、保留时间与你需要这些对象的时间一样长,而且还必须在你使用完它们之后,将其销毁。这样便带来一个有趣的问题。如果Java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C+里可能会发生的问题。这也是Java神奇之所在。Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不再需要,他们就会自行消失。这样做就消除了这类编程问题(即“内存泄漏”),这是由于程序员忘记释放内存而产生的问题。1.4 创建新的数据类型:类如果一
18、切都是对象,那么是什么决定了某一类对象的外观与行为呢?换句话说,是什么确定了对象的类型?你可能期望有一个名为“type”的关键字,当然它必须还要有相应的含义。然而,从历史发展角度来看,大多数面向对象的程序设计语言习惯用关键字class来表示“我准备告诉你一种新类型的对象看起来像什么样子”。class这个关键字(以后会频繁使用,本书以后就不再用粗体字表示)之后紧跟着的是新类型的名称。例如:class ATypeName /*Class body goes here*/这就引入了一种新的类型,尽管类主体仅包含一条注释语句(星号和斜杠以及其中的内容就是注释,本章后面再讨论)。因此,你还不能用它做太多
19、的事情。然而,你已经可以用new来创建这种类型的对象。ATypeName a = new ATypeName();但是,在定义它的所有方法之前,还没有办法能让它去做更多的事情(也就是说,不能向它发送任何有意义的消息)。1.4.1 字段和方法一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时被称作成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象(如前所述,使用
20、new来实现)相关联。每个对象都有用来存储其字段的空间;普通字段不能在对象间共享。下面是一个具有某些字段的类:Class DataOnlyint i;double d;Boolean b;尽管这个类除了存储数据之外什么也不能做,但是仍旧可以像下面这样创建它的一个对象;DataOnly data = new DataOnly();可以给字段赋值,但首先必须知道如何引用一个对象的成员。具体的实现为:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部的成员名称:objectReference.menber例如:data.i = 47;data.d = 1.1;data.b = false;想修
21、改的数据也有可能位于对象所包含的其他对象中。在这种情况下,只需要再使用连接句点即可。例如:MyPlane.leftTank.capacity = 100;DataOnly类除了保存数据外没别的用处,因为它没有任何成员方法。如果想了解成员方法的运行机制,就得先了解参数和返回值的概念,稍后将对此作简略描述。基本成员默认值若累的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值,当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化(C+没有此功能),防止产生程序错误。但是,这些初始值对你的程序来说,可能是不正确的,甚至是不合法的。所
22、以最好明确地对变量进行初始化。然而上述确保初始化的方法并不适用于“局部”变量(即非某个类的字段)。因此如果在某个方法定义中有int x; 那么变量x得到的可能是任意值(与C和C+中一样),而不会被自动初始化为零。所以在使用x前,应先对其赋一个适当的值。如果忘记了这么做,Java会在编译时返回一个错误。告诉你此变量没有初始化,这正是Java优于C+的地方。(许多C+编译器会对未初始化变量给予警告,而Java则视为是错误)。1.5 方法、参数和返回值许多程序设计语言(像C和C+)用函数这个术语来描述命名子程序;而在Java里却常用方法这个术语来表示“做某些事情的方式”。实际上,继续把它看作是函数也
23、无妨。尽管这只是用词上的差别,但本书将沿用Java的惯用法,即用术语“方法”而不是“函数”来描述。Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。下面是它最基本的形式:ReturnType methodName(/*Argument list*/)/* Method body*/返回类型描述的是在调用方法之后从方法返回的值。参数列表给出了要传递方法的信息的类型和名称。方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用。如
24、果试图在某个对象上调用它并不具备的方法,那么在编译时就会得到一条错误消息。通过对象调用方法时,需要先列出对象名,紧接着句点,然后是方法名和参数列表。如:objectName.methodName(arg1,arg2,arg3);例如,假设有一个方法f(),不带任何参数,返回类型是int。如果有个名为a 的对象,可以通过它调用f(),那么就可以这样写:int x = a.f();返回值的类型必须要与x的类型兼容。这种调用方法的行为通常被称为发送消息给对象。在上面的例子中,消息是f(),对象是a。面向对象的程序设计通常简单地归纳为“向对象发送消息”。1.5.1 参数列表方法的参数列表指定要传递给方
25、法什么样的信息。正如你可能料想的那样,这些信息像Java中的其他信息一样,采用的都是对象形式。因此,在参数列表中必须指定每个所传递对象的类型及名字。像Java中任何传递对象的场合一样,这里传递的实际上也是引用,并且引用类型必须正确。如果参数被设为String类型,则必须传递一个String对象;否则,编译器将抛出错误。假设某个方法接受String为其参数,下面是其具体定义,它必须置于某个类的定义内才能被正确编译。Int storage(String s)Return s.length()*2;此方法告诉你,需要多少个字节才能容纳一个特定的String对象中的信息(字符串的每个字符的尺寸都是16
26、位或2个字节,以此来提供对Unicode字符集的支持)。此方法的参数类型是String,参数名是s。一旦将s传递给此方法,就可以把他当作其他对象一样进行处理(可以给它传递消息)。在这里,s的length()方法被调用,它是String类提供的方法之一,会返回字符串 包含的字符数。通过上面的例子,还可以了解到return关键字的用法,它包括两方面:首先,它代表“已经做完,离开此方法”。其次,如果此方法产生一个值,这个值要放在return语句后面。在这个例子中,返回值是通过计算s.length()*2这个表达式得到的。你可以定义方法返回任意想要的类型,如果不想返回任何值,可以指示此方法返回void
27、(空)。下面是一些例子:boolean flag()return true;double naturalLogBase()return 2.178;void nothing()return;void nothing2()若返回类型是void,return关键字的作用只是用来推出方法。因此,没有必要到方法结束时才离开,可在任何地方返回。但如果返回类型不是void,那么无论在何处返回,编译器都会强制返回一个正确类型的返回值。到此为止,读者或许觉得:程序视乎只是一系列带有方法的对象组合,这些方法以其他对象为参数,并发送消息给其他对象。大体上确实是这样,但在以后章节中,读者将会学到怎样在一个方法内进行
28、判断,做一些更细致的底层工作。至于本章,读者只需要理解消息发送就足够了。附件2:外文原文Everything Is an Object“If we spoke a different language, we would perceive a some what different world.” Ludwig Wittgenstein (1889-1951)Although it is based on C+, Java is more of a “pure” object-oriented language.Both C+ and Java are hybrid languages, bu
29、t in Java the designers felt that the hybridization was not as important as it was in C+. A hybrid language allows multiple programming styles; the reason C+ is hybrid is to support backward compatibility with the C language. Because C+ is a superset of the C language, it includes many of that langu
30、ages undesirable features, which can make some aspects of C+ overly complicated.The Java language assumes that you want to do only object-oriented programming. This means that before you can begin you must shift your mindset into an object-oriented world (unless its already there). The benefit of th
31、is initial effort is the ability to program in a language that is simpler to learn and to use than many other OOP languages. In this chapter youll see the basic components of a Java program and learn that (almost) everything in Java is an object.You manipulate objects with referencesEach programming
32、 language has its own means of manipulating elements in memory. Sometimes the programmer must be constantly aware of what type of manipulation is going on. Are you manipulating the element directly, or are you dealing with some kind of indirect representation (a pointer in C or C+) that must be trea
33、ted with a special syntax?All this is simplified in Java. You treat everything as an object, using a single consistent syntax. Although you treat everything as an object, the identifier you manipulate is actually a “reference” to an object. You might imagine a television (the object) and a remote co
34、ntrol 1(the reference). As long as youre holding this reference, you have a connection to the television, but when someone says, “Change the channel” or “Lower the volume,” what youre manipulating is the reference, which in turn modifies the object. If you want to move aroundthe room and still contr
35、ol the television, you take the remote/reference with you, not the television.Also, the remote control can stand on its own, with no television. That is, just because you have a reference doesnt mean theres necessarily an object connected to it. So if you want to hold a word or sentence, you create
36、a String reference:But here youve created only the reference, not an object. If you decided to send a message to s at this point, youll get an error because s isnt actually attached to anything (theres no television). A safer practice, then, is always to initialize a reference when you create it:Str
37、ing s = asdf;However, this uses a special Java feature: Strings can be initialized with quoted text. Normally, you must use a more general type of initialization for objects.You must create all the objectsWhen you create a reference, you want to connect it with a new object. You do so, in general, w
38、ith the new operator. The keyword new says, “Make me a new one of these objects.” So in the preceding example, you can say:String s = new String(asdf);Not only does this mean “Make me a new String,” but it also gives information about how to make the String by supplying an initial character string.O
39、f course, Java comes with a plethora of ready-made types in addition to String. Whats more important is that you can create your own types. In fact, creating new types is the fundamental activity in Java programming, and its what youll be learning about in the rest of this book.Where storage livesIt
40、s useful to visualize some aspects of how things are laid out while the program is runningin particular how memory is arranged. There are five different places to store data:1. Registers. This is the fastest storage because it exists in a place different from that of other storage: inside the proces
41、sor. However, the number of registers is severely limited, so registers are allocated as they are needed. You dont have direct control, nor do you see any evidence in your programs that registers even exist (C & C+, on the other hand, allow you to suggest register allocation to the compiler).2. The
42、stack. This lives in the general random-access memory (RAM) area, but has direct support from the processor via its stack pointer. The stack pointer is moved down to create new memory and moved up to release that memory. This is an extremely fast and efficient way to allocate storage, second only to
43、 registers. The Java system must know, while it is creating the program, the exact lifetime of all the items that are stored on the stack. This constraint places limits on the flexibility of your programs, so while some Java storage exists on the stackin particular, object referencesJava objects the
44、mselves are not placed on the stack.Special case: primitive typesOne group of types, which youll use quite often in your programming, gets special treatment. You can think of these as “primitive” types. The reason for the special treatment is that to create an object with newespecially a small, simp
45、le variableisnt very efficient, because new places objects on the heap. For these types Java falls back on the approach taken by C and C+. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The variable holds the value directly, and it
46、s placed on the stack, so its much more efficient.Java determines the size of each primitive type. These sizes dont change from one machine architecture to another as they do in most languages. This size invariance is one reason Java programs are more portable than programs in most other languages.A
47、ll numeric types are signed, so dont look for unsigned types.The size of the boolean type is not explicitly specified; it is only defined to be able to take the literal values true or false.The “wrapper” classes for the primitive data types allow you to make a non-primitive object on the heap to represent that primitive type. For example:char c = x;Character ch = new Character(c);Or you