




已阅读5页,还剩267页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java语言程序设计教程,中国水利水电出版社,21世纪高等院校计算机系列教材,雷学生主编,目录,第1章Java语言概述第2章Java语言基础第3章控制语句第4章类及其方法第5章继承与多态第6章包和接口第7章异常处理第8章多线程编程第9章Applet编程第10章输入与输出第11章常用工具包和类,第1章Java语言概述,Java语言是由Sun公司于1995年推出的一种新的编程语言,它是一种跨平台、适合于分布式计算环境的纯面向对象语言。Java语言及其扩展正在逐步成为互联网应用的规范,掀起了自PC机以来的又一次技术革命。本章主要介绍Java语言的起源、特点、简单示例等。,1.1Java语言的起源和发展1.2面向对象的程序设计1.3Java语言的特点1.4Java程序的运行,Return,1.1Java语言的起源和发展,1.1.1几种典型语言的发展历程1.1.2Java语言的起源1.1.3Java语言的发展,Return,一般认为,B语言导致了C语言的诞生、C语言演变出C+语言,而Java语言则明显带有C+语言的特征。本节将对Java语言的起源和发展作简要介绍。,1.1.1几种典型语言的发展历程,Return,Java总是和C+联系在一起,而C+则是从C语言派生而来的,所以Java语言继承了这两种语言的大部分特性。Java的语法是从C继承的,Java许多面向对象特性都受到C+的影响。事实上,Java中几个自定义的特性都来自于或可以追溯到它的这些前驱语言。略有不同的是,Java语言完全面向对象,从而摒弃了二者的不足之处。Java语言的诞生与过去约30年中计算机语言的不断改进和发展密切相关。基于这些原因,下面我们将简要介绍一下这个发展历程。,1现代编程语言的诞生:C语言2对编程方法的新需要:C+语言3时机的到来:Java语言的出现,1.1.2Java语言的起源,Return,Java是由JamesGosling、PatrickNaughton、ChrisWarth、EdFrank以及MikeSheridan等人于1991年在SunMicrosystems公司设计出来的,开发第一个版本花了18个月时间。该语言最初名叫“Oak”,后来发现“Oak”已经是Sun公司另外一种语言的注册商标,于1995年更名为“Java”,即太平洋上一个盛产咖啡的岛屿的名字。从1992的秋天Oak问世,到1995春天公开发布Java语言,许多人都对Java的设计和改进做出了贡献。,1.1.3Java语言的发展,Return,自从于1995年被正式推出之后,Java语言就以其独特的优势迅猛发展,经过短短8、9年时间,成为迄今为止最为优秀的面向对象语言。Java也从当初的一种语言而逐渐形成一种产业,基于Java语言的J2EE架构已成为微软.NET平台的强大竞争对手。当初,Java语言最初的发布不亚于一场革命,但是它并不标志着Java快速革新时代的结束。在Java1.0发布后不久,Java的设计者就已经制定出了Java1.1、Java1.2、Java1.3、Java1.4、Java2、Java2.1.4版。,1.2面向对象的程序设计,1.2.1面向对象技术的提出1.2.2面向对象的编程思想1.2.3面向对象编程的基本原则,Return,面向对象的编程思想由来已久,但真正意义上的纯面向对象编程语言目前只有Java。本节将结合几种高级语言对面向对象程序设计思想进行简要介绍。,1.2.1面向对象技术的提出,Return,我们知道,所有的计算机程序均由两类元素组成:代码和数据。如何实现这两类元素的有效结合而形成可运行的程序,是多年来程序设计人员所探索的问题。最初,程序的构筑一般围绕“正在发生什么”而编写代码,这种方法被称为面向过程的编程。使用这种方法编写的程序都具有线性执行的特点。面向过程的编程模型可认为是代码作用于数据,像Pascal、C这样的过程式语言采用此模型是相当成功的。然而,使用面向过程的方法对小程序的编写可能是比较有效的,但当程序变得非常大且更为复杂时,就会出现种种问题,直至失去对代码的有效控制。由此对软件工程中的编程方法问题提出了新的要求。为了管理不断增加的复杂性,另外一种编程方式被提了出来,即面向对象的编程(OOP,Object-OrientedProgramming)。这种编程方式围绕“谁将受到影响”进行,即以代码的相关数据为核心点进行程序编写。面向对象的编程着眼于它的数据(即对象)和为此数据严格定义的接口来组织程序,程序实际上是用数据控制对代码的访问。这种方式的最大特点是代码与其相关数据被分离开来进行处理,有利于程序规模的扩大,而程序的可维护性得到增强。,1.2.2面向对象的编程思想,Return,前面提到的面向过程程序,它遵循面向过程的问题求解方法,其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决流程。数据结构和算法是面向过程问题求解的核心所在。而面向对象技术则代表了一种全新的程序设计思路,其观察、表述、处理问题的方法,与传统的面向过程的编程方法不同。面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,尽量分解、降低问题的难度和复杂性,从而提高整个求解过程的可监测性、可控制性和可维护性,以此达到以较小代价和较高效率获得较满意效果之目的。面向对象编程一个实质性的要素是抽象。,1.2.3面向对象编程的基本原则,1封装性封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。一个对象的基本要素包括属性和作用在属性上的操作(方法或事件)。对象的使用实现了数据抽象,它将一组数据和对这组数据的操作结合成一个内在的整体,不允许外界对这组数据任意进行访问,这里就用到了封装的原理。封装的目的是为了实现数据隐藏和数据保护,为对象提供一个对外操作的接口,外界只能从对象所提供的操作接口来认识和操作该对象。,一般说来,面向对象的系统至少需具备三大特性:封装性、继承性、多态性。将封装、继承、多态(包括重载)等面向对象方法应用于程序的开发工具和开发过程中,不仅可以加快开发的速度,还可极大地增强程序的可维护性和可扩展性,提高代码重用率。因此,在面向对象编程过程中需要遵循这三项原则。下面对它们分别作简要介绍。,2.继承性,继承(Inheritance)是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了层级分类的思想。众所周知,大多数事物均可按层级(即从上到下、从高到低)分类管理。显然,如果不使用层级的概念,在进行描述时,我们就不得不分别定义每个事物的所有属性。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那里继承其他所有的通用属性。所以,完全可以这样说,正是继承机制使一个对象成为一个更具通用性的类的一个特定实例成为可能。继承是现实生活中一个非常容易理解的概念。在面向对象的程序设计方法中,引入继承机制的目的在于:其一,避免可公用代码的重复开发,减少数据冗余;其二,增强数据的一致性,尽量降低模块间的耦合程度。,3多态性,多态(Polymorphism)来自于希腊语,表示“多种形态”,即允许一个接口被多个同类动作所使用的特征,具体使用哪个动作与应用场合有关。所谓多态性就是当不同的对象收到相同的消息时,产生不同动作的特性。这里所说的消息可以理解为方法或事件。通俗地讲,多态性就是使用一个名称来定义不同的方法,这些方法执行类似的但又不同的操作,即以相同的接口来访问功能不同的函数,从而实现“一个接口,多种方法”。,Return,4多态性、封装性与继承性的相互作用,如果使用得当,在由多态性、封装性和继承性共同组成的编程环境中可以写出比面向过程模型环境更健壮、扩展性更好的程序。精心设计的类层级结构是实现代码可重用性的基础;封装可以使你在不破坏依赖于类公共接口的代码基础上对程序进行升级迁移;而多态性则有助于编写清晰、易懂、易读、易修改的程序。,1.3Java语言的特点,1.3.1语言特点概述1.3.2Java语言的具体特点1.3.3Java和C/C+的比较,Return,作为当前一种被广泛使用的面向对象编程语言,Java具有多方面的特点。如果与其他众多的编程语言作一下比较,会发现这些特点正是Java语言之所以如此风靡的原因所在。虽然Java在某些方面(例如资源耗费)也存在一些不足,但这丝毫不影响Java作为目前最优秀面向对象编程语言的地位。,1.3.1语言特点概述,1Java的灵魂:字节码2Java的内涵:丰富的类库,Return,Java是一种被广泛使用的网络编程语言,这是一种新的计算概念。网络环境下的编程语言最需要解决的是可移植性和安全性问题。以字节方式进行编码,使得程序不受运行平台和环境的限制成为可能。Java语言还提供了丰富的类库,使程序设计人员可以很方便地调用相关类建立起自己的系统。主要表现在:,1.3.2Java语言的具体特点,1.简单性2.面向对象3.分布性4.鲁棒性5.可移植性,Return,Java作为一种高级程序设计语言,它除具有面向对象、编写简单、脱离机器结构、具有分布性、鲁棒性、可移植性、安全性特点外,并且提供了并发机制,解释执行具有很高的性能。同时,还具有动态性特点。主要表现在:,6.安全性7.结构中立8.高性能9.多线程10.动态性,1.3.3Java和C/C+的比较,Return,对于变量声明、参数传递、操作符、流控制等,Java使用了和C/C+相同的风格,这使得熟悉C/C+的程序员能很方便地进行编程语言切换。同时,Java实现并加强了其简单、鲁棒、安全等特性,也摒弃了C和C+中许多不合理的地方。主要表现在:,1.头文件2.全局变量3.指针4.内存管理,5.数据类型支持6.类型转换7.结构和联合8.预处理,1.4Java程序的运行,1.4.1Java运行环境的安装与配置1.4.2第一个Java程序1.4.3两种类型的Java程序1.4.4Java环境的有关工具1.4.5Java程序的编写开发工具,Return,由于Java是采用Java虚拟机进行解释执行的编程语言,它需要一定的软件支撑环境才能够运行起来。本节将先介绍Java的运行环境,然后介绍Java程序的编写。,1.4.1Java运行环境的安装与配置,Return,编写并运行Java程序,需要Java开发工具包(JDK,JavaDevelopmentKit)的支持。因此在编写自己的第一个Java程序前,读者需要先在自己的机器上安装JDK。到目前为止,JDK的发展经历了JDK1.0、JDK1.1、JDK1.2、JDK1.3、JDK1.4等几个版本。,1.4.2第一个Java程序,说明:保留字class来声明一个新的类,其类名为HelloWorldApp,它是一个公共类(public)。整个类定义由大括号对括起来。在该类中,定义了一个main()方法,其中public表示访问权限,指明所有的类都可以使用这一方法;static指明该方法是一个类方法,它可以通过类名直接调用;void则指明main()方法不返回任何值。对于一个应用程序来说,main()方法是必需的,而且必须按照如上的格式来定义。Java解释器在没有生成任何实例的情况下,以main()作为入口来执行程序。Java程序中可以定义多个类,每个类中可以定义多个方法,但是最多只有一个公共类,main()方法也只能有一个,作为程序的入口。在main()方法定义中的,括号中的Stringargs是传递给main()方法的参数,参数名为args,它是类String的一个实例,参数可以为0个或多个,每个参数用“类名参数名”来指定,多个参数间用逗号分隔。在main()方法的实现中,只有一条语句:System.out.println(HelloWorld!);它用来实现字符串的输出。“/”后的内容为注释。,下面是一个经典的Java入门程序,虽然只有短短几行代码,但其中的内容却很丰富,后面将作具体说明:publicclassHelloWorldApppublicstaticvoidmain(Stringargs)/Outputthefirstsentence:System.out.println(HelloWorld!);此程序的作用是输出下面一行信息:HelloWorld!,Java程序的编译及运行,Return,首先,将其保存到一个名为HelloWorldApp.java的文件中。注意:文件名应该与类名相同,因为Java解释器要求公共类必须放在与其同名的文件中。然后,对它进行编译。C:JavaBookjavacHelloWorldApp.java编译的结果是生成字节码文件HelloWorldApp.class。最后,使用java命令来运行该字节码文件。C:JavaBookjavaHelloWorldApp其结果就是在显示器上显示出“HelloWorld!”这行文字。,1.4.3两种类型的Java程序,在Java中可以编写两类程序:应用程序(applications)和JavaApplet(小应用程序)。应用程序是可以在控制台上直接运行的程序,在创建应用程序时,Java与其他高级编程语言没有太大区别,而Java的特色就在于它具有编制小应用程序的功能。小应用程序是可以在Internet中传输并在兼容Java的Web浏览器中运行的应用程序。小应用程序实际上就是小型的Java程序,能像图像文件、声音文件和视频片段那样通过网络动态下载,它与其他文件的重要差别是,小应用程序是一个智能的程序,能对用户的输入作出反应,并且能动态变化,而不是一遍又一遍地播放同一动画或声音。前面对applications作了介绍,下面我们来介绍一下JavaApplet的结构和应用。,JavaApplet的结构和应用,Return,importjava.awt.*;importjava.applet.*;publicclassHelloWorldAppletextendsApplet/Thisisanapplet.publicvoidpaint(Graphicsg)g.drawString(HelloWorld!,30,30);该程序的功能是:在坐标(30,30)处输出字符串“HelloWorld!”。在这个程序中,没有实现main()方法,这是Applet与Application(应用程序)的区别之一。为了运行该程序,首先也应将其保存到一个名为HelloWorldApplet.java的文件中,然后对其进行编译:C:JavaBookjavacHelloWorldApplet.java这样将得到字节码文件HelloWorldApplet.class。由于Applet中没有main()方法作为Java解释器的入口,我们必须编写HTML文件,然后将Applet嵌入其中,接着使用appletviewer来运行,或在支持Java的浏览器上运行。,该HTML文件如下。AnApplet其中,使用标记来启动HelloWorldApplet,code属性指明字节码所在的文件,width和height属性指明applet所占区域范围。最后,我们将此HTML文件存入AppletExp.htm,然后运行:C:JavaBookappletviewerAppExp.htm此时,将弹出一个Applet浏览窗口,在其中指定区域显示“HelloWorld!”。,下面再看一个例子,1.4.4Java环境的有关工具,Return,Java提供了一些常用的语言工具,主要包括:1、java:解释器2、javac:编译器3、appletviewer:小应用程序浏览器4、javah:头文件生成器5、javadoc:API文档生成器6、javap:类文件反汇编器7、jdb:Java语言调试器这些文件包括在/java/bin/目录中,并可以在任何目录中运行,前提是设置了运行程序的相应系统路径。,1.4.5Java程序的编写开发工具,Return,最后将要说明一下Java程序的编写开发工具。对于一般简单程序的编写,几乎使用任何文本编辑器都可以进行。例如操作系统所带的记事本、写字板等程序。本书中所涉及的Java程序一般使用UltraEdit编写。UltraEdit是一个非常理想的Java程序编写器,它目前的最新版本是Version10。如果要进行比较复杂的Java应用系统开发,可使用专门的Java集成开发工具,如JBuilder、VisualJ+、VisualAge、JCreator等。其中优秀的开发工具支持与应用服务如BEAWebLogic、IBMWebSphere的集成。具体选用哪种开发工具要视项目的具体情况而定。,第2章Java语言基础,本章将介绍Java语言的基础知识,包括基本语言要素、基本数据类型、变量、数组、运算符等。扎实地掌握这些内容对后续学习是很有必要的。,2.1预备知识2.2基本语言要素2.3基本数据类型2.4变量2.5数组2.6运算符,Return,2.1预备知识,2.1.1一个简单的Java程序2.1.2两种控制语句2.1.3关于程序块,Return,在第1章中,我们已经学会了编写“HelloWorld”这种极为简单的Java程序。为了便于本章后面内容的叙述,本节将再介绍一个稍复杂的Java程序,使读者在学习Java语言的基础知识前也能够编写简单的Java程序。,2.1.1一个简单的Java程序,classMyExamplepublicstaticvoidmain(Stringargs)intnum;num=200;System.out.println(Thisisnum:+num);num=num*2;System.out.print(Thevalueofnum*2is:);System.out.println(num);,下面是一个简单的Java程序。读者将会看到,这个程序虽然不是很复杂,但其中所包含的内容和功能却很丰富。,运行结果:Thisisnum:200Thevalueofnum*2is:400,对大多数的编程语言来说,程序源代码文件的命名是任意的,只要符合所运行的操作系统平台的要求即可。但这对于Java来说就行不通。在开始进行Java编程前,读者需要知道的第一件事情就是:源文件的名称必须与主类名一致。这一点非常重要。对于上面的例子,源程序文件名就应该是MyExample.java。下面我们将解释其中的原因。在Java中,一个源程序文件被称为一个编译单元(CompilationUnit),它是包含一个或多个类定义的文本文件。Java编译器要求源程序文件使用.java作为扩展名。请注意,文件扩展名的长度是4个字符,因此所用操作系统一定要有支持长文件名的能力。这就意味着DOS和Windows3.x是不支持Java文件命名规则的。从上述示例程序中可以看出,程序中定义的类名也是MyExample,这不是巧合。在Java中,所有的代码都必须驻留在类中。按照约定,类名必须与源程序的文件名相同,同时还要确保文件名的大小写字母与类名一样,因为Java是区分大小写的。虽然文件名与类名必须一致的约定显得似乎有些死板,但是这个约定有助于编程人员轻松地维护和组织程序。,1关于该程序的命名,在第1章中曾经涉及到这方面的内容。要编译并运行示例程序MyExample,首先要运行编译器程序javac,并在命令行上指定源程序文件名,具体格式如下。C:javacMyExample.java这样,编译器javac产生一个名为MyExample.class的文件,该文件包含程序的字节码。前面已讨论过,Java字节码中包含的是Java解释程序将要执行的指令码,因此javac的输出结果并不是可以直接运行的代码。要真正运行该程序,必须使用名为java的Java解释器。具体方法是将类名MyExample作为一个命令行参数输入,格式如下:C:javaMyExample如果程序运行正常,将输出如下内容:Thisisnum:200Thevalueofnum*2is:400,2编译和运行程序,提示:当Java源代码被编译后,每个单独的类都被放入自己的输出文件中,并以类的名字加.class扩展名为其文件名。这就是为什么Java源程序文件必须与其中包含的类同名的原因源程序文件将与.class文件同名。运行Java解释器,实际上是指定想要解释器运行的类的名字,它会自动搜索包含该名字且带有.class扩展名的文件。如果找到,它将运行包含在该指定类中的代码。,Return,2.1.2两种控制语句,1.if控制语句Java中的if控制语句与其他编程语言中的IF语句非常相似,并且与C/C+语言中的if语句的语法完全相同。它最简单的形式如下:if(condition)statement;其中:condition是一个布尔表达式。如果其值为真,那么执行语句statement;如果其值为假,则语句statement将被绕过而不被执行。例如下列语句:if(num2008)println(Youarewelcome!);该语句的功能是:如果变量num的值小于2008,那么条件表达式的值为真,方法println()将被调用执行,否则方法println()被绕过而不被执行。,尽管在后面的第3章中将详细讨论Java控制语句,这里我们还是先简要介绍两种控制语句,以便能在本章后面的例程中使用它们。,classIfSamplepublicstaticvoidmain(Stringargs)inta,b;a=100;b=200;if(ab)System.out.println(anowgreaterthanb);,下面的程序说明了if控制语句的用法。,运行结果:aislessthanbanowequaltobanowgreaterthanb,在几乎所有的编程语言中,循环语句都是很重要的组成部分,这对于Java也不例外。事实上,在后面的有关章节中读者将会看到,Java提供了一套功能强大的循环结构,而for循环也许是最通用的。如果读者对C/C+熟悉,会发现Java的for循环和C/C+语言中的for循环操作完全一样。最简单的for循环结构的形式如下:for(initialization;condition;iteration)statement;其中,循环体的初始化部分(initialization)设置循环变量并为变量赋初始值。条件判断部分(condition)是测试循环控制变量的布尔表达式。若测试结果为真,循环体(statement)继续反复执行;若测试结果为假,循环结束。迭代部分(iteration)的表达式决定循环控制变量在每次循环后是如何改变的。,2.for循环语句,classForTestpublicstaticvoidmain(Stringargs)inta;for(a=0;a10;a=a+1)System.out.println(Thisisa:+a);,下面的这个短程序说明了for循环的使用方法。,运行结果如下:Thisisa:0Thisisa:1Thisisa:2Thisisa:3Thisisa:4Thisisa:5Thisisa:6Thisisa:7Thisisa:8Thisisa:9,在该例子中,a是循环控制变量,它在for的初始化部分被初始化为零。在每次重复迭代(包括第一次)的开始,执行条件测试a10。如果测试的结果为真,则println()语句被执行,然后执行循环体的迭代部分。此过程将持续进行下去,直到条件测试的结果为假。,注意:通常在Java专业程序员编写的程序中,循环体的迭代部分很少会看到象“a=a+1;”的语句。原因是:Java语言中有一个特殊的增量运算符,即“+”和“-”,它们的作用分别是为对象加1和为对象减1。这样,前述的for循环语句通常写成下列这样:for(a=0;a10;a+),Return,2.1.3关于程序块,在Java语言中,可以将2个或2个以上的语句组成一个语句组,这样的一组语句被称为程序块(Codeblocks)。程序块通过将所属语句放在大括号中来实现。一旦创建了程序块,它就成为一个逻辑单元,可以作为一个单独的语句来使用。例如,程序块可以作为Java中if控制语句和for控制语句的目标。下面我们来看一下如下的if控制语句:if(ab)/beginablocka=b;b=0;/endofblock本例中,如果a小于b,那么在程序块内的两条语句都将被执行。因此,程序块中的这2条语句组成一个逻辑单元,不能出现一条语句运行,而另一条语句不运行的情况。其中的关键点是如果你需要将两个或多个语句在逻辑上连接起来,就可以将其放入一个程序块中。,2.1.3关于程序块,又例如,下面的程序将for循环作为一个程序块使用:classBlockTestpublicstaticvoidmain(Stringargs)inta,b;b=20;/thetargetofthisloopisablockfor(a=0;a1istrue,Return,下面对以上程序代码作几点说明。首先,读者已经看到了,当用方法println()输出布尔类型的值时,显示的是“true”或“false”;其次,布尔变量的值本身就足以用来对if语句进行控制,没有必要将if语句写成如下的形式。if(b=true).另外,关系运算符(例如1的值就是“true”。在表达式111的两边额外地加上括号,是由于加号“+”运算符的优先级比运算符“”的优先级要高。,2.3.6对字面量的进一步讨论,在本章2.2.3小节中我们曾简要介绍过字面量(或常量)。现已介绍完基本数据类型,让我们对字面量作进一步讨论。,1整数型字面,整数可能是程序中最常用的类型。任何一个数字的值就是一个整数字面量。例如1、2、3、42等。这些都是十进制的值,这意味着对它们的描述基于数字10。在Java中,还有另外两种进制被整数字面量使用:八进制(Octal,基数是8)和十六进制(Hexadecimal,基数是16)。八进制的值通过在它的前面加一个前导0来表示,而正常的十进制数字则不用前导零。这样看起来有效的值09对八进制来说将产生一个编译错误,因为9超出了八进制的范围07。对编程人员来说,十六进制更常用,它清楚地与8的大小相匹配,如8、16、32、64等。通过前导的0 x或0X表示一个十六进制的字面量。十六进制数的范围是015,用AF(或af)来替代1015。整数字面量产生int值,在Java中它是32位的整数值。既然Java对类型要求严格,你可能会纳闷,为什么将一个整数字面量赋给Java的其他整数类型如byte或long而没有产生类型不匹配的错误呢。庆幸的是,这个问题已很好解决。当一个字面量的值被赋给一个byte或short型的变量时,如果字面量的值没有超过对应类型的范围则不会产生错误。所以,一个字面量总是可以被赋给一个long变量。但是,指定一个long字面量,你需要清楚地告诉编译器字面量的值是long型,这可以通过在字面量的后面加一个大写或小写的L来做到这一点。例如0 x7ffffffffffffffL(或9223372036854775807L)就是long型中最大的。,2浮点型字面量,浮点数是指具有小数部分的十进制数值,它们可以通过标准记数法或者科学记数法来表示。标准记数法(Standardnotation)由整数部分加小数点加小数部分组成。例如2.0、3.14159、0.6667等都是有效的标准记数法的浮点数值。科学记数法(Scientificnotation)是浮点数加一表明乘以10的指定幂次的后缀,指数是紧跟E或e的一个十进制的数字,它可以是正值、零或者负值。例如6.022E23、314159E-05、2e+100等。Java中的浮点字面量默认是双精度。为了指明一个浮点字面量,编程人员必须在字面量后面加F或f。当然,你也可以通过在字面量后面加D或d来指明一个双精度浮点字面量,但这样做当然是多余的。默认的双精度类型要占用64位存储空间,而精确度低些的浮点类型仅仅需要32位。,3布尔型字面量,布尔型字面量很简单,因为布尔型字面量只有两个逻辑值:treu(真)或false(假)。真值或假值不会改变任何数字的表示。在Java中,真字面量的值不等于1,假字面量的值也不等于0,它们仅仅能被赋给已定义的布尔变量,或在布尔的运算符表达式中使用。这一点与C/C+中是不同的。,4字符型字面量,我们已经知道,Java采用Unicode字符集来表示字符。Java的字符是16位值,可以被转换为整数并可进行像加或减这样的整数运算。通过将字符包括在单引号之内来表示字符字面量。所有可见的ASCII字符都能直接被包括在单引号之内,例如a,z,and。对于那些不能直接被包括的字符,有若干转义序列,这样允许你输入所需要的字符。例如,代表单个引号字符本身,n代表换行符字符。为直接得到八进制或十六进制字符的值也有一个机制。对八进制来说,使用反斜线加3个阿拉伯数字。例如,141是字母a。对十六进制来说,使用反斜线和u加上4个十六进制阿拉伯数字。例如,u0061因为高位字节是零,代表ISO-Latin-1字符集中的a。ua432是一个日文片假名字符。教材P41页表2-5列出了Java中的字符转义序列。,5字符串字面量,同其他大多数编程语言一样,Java中的字符串字面量使用双引号括起来。字符串字面量的例子如下。HelloWorld!threenlinesThisisinquotes为字符型字面量所规定的字符转义序列和八进制/十六进制记法,在字符串内同样是适用的。对于Java字符串,应特别注意的是它们必须在代码的同一行开始、同一行结束,而不像某些语言有换行连接转义序列。注意:读者可能知道,在其他大多数语言(包括C/C+)中,字符串作为字符的数组被实现,然而在Java中却并非如此。在Java中,字符串实际上是对象类型,Java是将字符串作为对象实现的。因此,它有广泛的字符串处理能力,而且功能既强又好用。在Java中,如果要声明真正意义上的常量(即使用标识符代表某个常值),可使用关键字final(类似于C/C+中的const)。例如,在下面的例子中就声明了一个int类型常量:finalintARRAY_SIZE=5;,Return,2.4变量,2.4.1Java变量的声明2.4.2变量的作用域和生存期2.4.3类型转换,Return,变量是Java程序中的一个基本存储单元。变量由一个数据类型、标识符以及一个可选初始值的组合来进行定义。此外,所有的变量都有一个作用域,指定变量的可见性和生存期。本节将对Java变量及其相关问题作详细说明。,2.4.1Java变量的声明,在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下。typeidentifier=value,identifier=value.;其中,type应是Java的基本类型之一,或者类及接口类型的名字(关于类和接口将在本书后面有关章节中讨论)。identifier(标识符)是变量的名字,其后用一个等号和一个值来初始化变量。需要注意的是,初始化表达式的取值必须与指定变量类型一样或兼容。在声明指定类型的多个变量时,使用逗号将各变量分开。以下是变量声明的几个例子,其中有一些已经进行了初始化:inta,b,c;/declaresthreeints,a,b,d=3,e,f=5;/declaresthreemoreints,initializingdandf.byteg=123;/initializesg.doublepi=3.1416;/declaresanapproximationofpi.charx=x;/thevariablexhasthevaluex.不难知道,你所选择的标识符名称没有任何表明它们相应类型的成分。许多读者可能还记得FORTRAN语言中预先规定从I到N的所有标识符都为整型变量,而其他标识符为实型变量。Java则允许任何合法的标识符具有任何它所声明的数据类型。,1声明一个变量,Return,尽管前面的例子中仅将字面量作为其初始值,Java语言也允许在变量声明时使用任何有效的表达式来动态地初始化变量。例如,下面的程序代码用于在给定直角三角形两个直角边长度的情况下,求其斜边长度。/Demonstratedynamicinitialization.classDynInitpublicstaticvoidmain(Stringargs)doublea=3.0,b=4.0;/cisdynamicallyinitialized:doublec=Math.sqrt(a*a+b*b);System.out.println(Hypotenuseis:+c);在这里,我们定义了3个局部变量a、b、c。前两个变量a和b被初始化为常量,而直角三角形的斜边c则被动态地初始化(使用勾股定理)。该程序用了Java中另外一个内置的方法sqrt(),它是Math类的一个成员,计算它的参数的平方根。这里关键的一点是初始化表达式可以使用任何有效的元素,包括方法调用、其他变量或字面量。,2动态初始化,2.4.2变量的作用域和生存期,大多数计算机编程语言定义了两大类作用域:全局和局部。然而,这些传统型的作用域并不适合Java的严格的面向对象编程模型。将一个变量定义为全局变量当然是可行的,但这是例外而不是规则。在Java中,两个主要的作用域是通过类和方法定义的。尽管类的作用域和方法的作用域的区别有点人为规定,因为类的作用域有若干独特的特点和属性,而且这些特点和属性不能应用到方法定义的作用域,但这些差别还是很有意义的。类(以及在其内定义的变量)的作用域问题我们将在本书后面的章节中介绍。到现在为止,我们将仅仅考虑由方法或在一个方法内定义的作用域。,到目前为止,我们所使用的所有变量都是在方法main()后面被声明。事实上,Java允许变量在任何程序块内被声明。前面已经说明过了,程序块被包括在一对大括号中。一个程序块定义了一个作用域。这样,每当开始一个新块,你就创建了一个新的作用域。不难发现,一个作用域决定了哪些对象对程序的其他部分是可见的,也决定了这些对象的生存期。,下面对作用域问题作几点说明:(1)方法定义的作用域以它的左大括号开始。但是,如果该方法有参数,那么它们也被包括在该方法的作用域中。参数问题在后面章节中将作进一步的讨论,因此现在可认为它们与方法中其他变量的作用域是一样的。(2)作为一个通用规则,在一个作用域中定义的变量对于该作用域外的程序是不可见(即访问)的。因此,当你在一个作用域中定义一个变量时,你就将该变量局部化并且保护它不被非授权访问和/或修改。实际上,作用域规则为封装提供了基础。(3)作用域可以进行嵌套。例如,每当你创建一个程序块,就创建了一个新的嵌套的作用域。这样,外面的作用域包含内部的作用域。这意味着外部作用域定义的对象对于内部作用域中的程序是可见的。但反过来就不是,内部作用域定义的对象对于外部是不可见的。,考察下面的程序。/Demonstrateblockscope.classScopeExamplepublicstaticvoidmain(Stringargs)intx;/knowntoallcodewithinmainx=10;if(x=10)/startnewscopeinty=20;/knownonlytothisblock/xandybothknownhere.System.out.println(xandy:+x+y);x=y*2;/y=100;/Error!yisnotknownhere./xisstillknownhere.System.out.println(xis+x);,正如注释中说明的,在方法main()的开始定义了变量x,因此它对于main()中的所有的随后代码都是可见的。在if程序块中定义了变量y,因为一个块定义一个作用域,y仅仅对在它的块以内的其他代码可见。这就是在它的块之外的程序行y=100;被注释掉的原因。如果你将该行前面的注释符号去掉,编译程序时就会出现错误,因为变量y在它的程序块之外是不可见的。在if程序块中可以使用变量x,因为块(即一个嵌套作用域)中的程序代码可以访问被其包围作用域中所定义的任意变量。显然,变量可以在程序块内的任何地方被声明,但是只有在他们被声明以后才是合法有效的。因此,如果你在一个方法的开始定义了一个变量,那么它对于在该方法以内的所有程序都是可用的。反之,如果你在一个程序块的末尾声明了一个变量,它就没有任何用处,因为没有程序会访问它。,另一个需要注意的地方是:变量在其作用域内被创建,离开其作用域时被撤消。这意味着一个变量一旦离开它的作用域,将不再保存它的值了。因此,在一个方法内定义的变量在几次调用该方法之间将不再保存它们的值。同样,在块内定义的变量在该块被舍弃时,也将丢掉它的值。因此,一个变量的生存期就被限定在它的作用域之内。如果一个声明定义包括了动态初始化,那么每次进入声明它的程序块时,该变量都要被重新初始化。例如,考虑如下的程序。,/Demonstratelifetimeofavariable.classLifeTimepublicstaticvoidmain(Stringargs)intx;for(x=0;x3;x+)inty=-1;/yisinitializedeachtimeblockisenteredSystem.out.println(yis:+y);/thisalwaysprints-1y=100;System.out.println(yisnow:+y);,可以看到,每次进入内部的for循环,y都要被重新初始化为-1。这样,即使它随后被赋值为100,该值还是被丢弃了。,运行结果如下:yis:-1yisnow:100yis:-1yisnow:100yis:-1yisnow:100,Return,另外还有一点,尽管程序块能被嵌套,但不能将内部作用域声明的变量与其外部作用域声明的变量重名。在这一点上,Java不同于C和C+。下面的例子企图为两个独立的变量起同样的名字。在Java中,这是不合法的。但在C/C+中,它将是合法的,而且两个变量bar将是独立的。/ThisprogramwillnotcompileclassScopeErrpublicstaticvoidmain(Stringargs)intbar=100;/bar=200;/Compile-timeerrorbaralreadydefined!,2.4.3类型转换,如果读者以前有一定的编程经验,那么就应该知道将一种类型的值赋给另外类型的一个变量是相当常见的。如果这两种类型是兼容的,那么Java将自动地进行转换。例如,将int类型的值赋给long类型的变量,总是可行的。然而,不是所有的类型都是兼容的,因此,不是所有的类型转换都是可以隐式实现的。例如,没有将double型转换为byte型的定义。幸好,获得不兼容的类型之间的转换仍然是可能的。要达到这个目的,必须使用一个强制类型转换,它能完成两个不兼容的类型之间的显式变换。让我们看看自动类型转换和强制类型转换。,1Java的自动类型转换,如果下列两个条件都能满足,那么将一种类型的数据赋给另外一种类型变量时,将执行自动类型转换。这两个条件分别是:这两种类型是兼容的;目的数据类型的取值范围比来源数据类型的取值范围要大。当满足以上两个条件时,自动的“加宽转换”就可以进行。例如,int型的取值范围比所有byte型的合法取值范围要大,因此不需要随后将介绍的显式强制类型转换语句。对于加宽转换,数字类型,包括整数(integer)和浮点(floating-point)类型都是彼此兼容的,但是,数字类型和字符类型(char)或布尔类型(boolean)是不兼容的。字符类型(char)和布尔类型(boolean)也是互相不兼容的。,2不兼容类型的强制类型转换,尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,当需要将int型的值赋给一个byte型的变量时该怎么办?这种转换不会自动进行,因为byte型的有效取值范围比int型的要小。此时,只有采取被称为“变窄转换”的转换方式。因为你肯定要将源数据类型的值变小才能适合目标数据类型。在这种情况下,为了完成两种不兼容类型之间的转换,就必须进行强制类型转换。所谓的强制类型转换是一种显式的类型变换方式,其通用格式如下。(target-type)value其中,目标类型(target-type)指定了要将指定值所转换成的类型。例如,下面的程序段将int型强制转换成byte型。如果整型变量的取值超出了byte型的取值范围,它的值将会因为对byte型的值域取模(整数除以byte得到的余数)而减少。inta;byteb;/.b=(byte)a;当把一个浮点值赋给整数类型时,将发生一种不同的类型转换:截断。大家都知道整数没有小数部分。这样,当把浮点值赋给整数类型时,它的小数部分将会被舍去。例如,如果将值1.23赋给一个整数,其结果只是1,0.23被舍弃。当然,如果浮点值太大而不能适合目标整数类型,那
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川成都交通投资集团有限公司春季校园招聘10人笔试参考题库附带答案详解
- 日照职业技术学院《医用电子学》2023-2024学年第二学期期末试卷
- 安徽工贸职业技术学院《工程结构抗震A》2023-2024学年第二学期期末试卷
- 贵州经贸职业技术学院《显微构造地质学》2023-2024学年第二学期期末试卷
- 萍乡学院《ORACE数据库》2023-2024学年第二学期期末试卷
- 集宁师范学院《nternet协议分析A(实验)》2023-2024学年第二学期期末试卷
- 沈阳城市建设学院《剧本创作》2023-2024学年第二学期期末试卷
- 青岛职业技术学院《教育基础理论理工》2023-2024学年第二学期期末试卷
- 和君职业学院《资源循环科学与工程概论》2023-2024学年第二学期期末试卷
- 上海民远职业技术学院《专业导论(人工智能)》2023-2024学年第二学期期末试卷
- 教师教学能力比赛-教学实施报告(计算机-网络系统集成)
- 2023年中级《专业知识与实务(农业)》核心考点题库300题(含详解)
- 水泥砂浆砌毛石排水沟施工方法
- XX站既有雨棚拆除及新建雨棚安装施工专项方案
- 内镜室护理组长竞聘演讲
- 酒店如何做年度经营分析
- 拆除工程施工安全培训
- 《一本书读懂Web3.0区块链、NFT、元宇宙和DAO》读书笔记
- 客服线上运营方案
- 项目管理班子人员岗位职责及分工
- 《物控培训资料》课件
评论
0/150
提交评论