求教写的时钟程序判断是否为闰年的程序导不进去,单独语句也应该没错

当前位置: >>
JAVA编程B实验指导书
JAVA 编程 B 实验指导书课 程 号: 适用专业:通信工程 制 定 人:赵建峰 教 研 室:信息处理研究室内蒙古科技大学信息工程学院 2010 年 4 月 前言一、 上机实验目的上机实验是学生扎实掌握Java语言基本概念、基本方法,以及熟练使用Java 集成开发环境的唯一手段。通过亲手编程编写Java语言程序,可理解Java语言的 基本结构和程序设计方法。同时,学生通过分析实验内容、设计实验方法、解决 实验中遇到的问题,可有效提高逻辑思维能力和动手能力。二、 实验基本内容根据教学内容以及专业特点,本实验指导书编写了8个实验。要求学生在课 内机时完成指导书中的前六个实验,并根据所学的知识理解Java编程的基本要 领。 在此基础上课后完成实验指导书中的后两个设计性实验,以此来拓展学生的 知识面, 增强学生的实际编程能力。实验指导书中的8个实验具体内容如下所示: 1、Java 编程基础; 2、Java 基本语法; 3、面向对象编程; 4、系统类库调用; 5、常用基础类库; 6、图形界面编程; 7、网络通信编程; 8、J2SE程序设计; 9、J2ME程序设计。三、实验任务与时间安排《Java编程B》是一门实践性很强的课程,除了在课内安排的实验外,鼓励 同学在课外用相关技术进行编程练习。《Java编程B》上机实验时间为12学时, 分为6个课内实验和2个综合实验, 其中后两个综合实验之要求独立完成其中一个 即可。1 实验要求一、可读性一个好的程序员必须要有良好的编程习惯, 编写的程序应当具备非常好的可 读性。这样既方便自己日后的查阅,又可方便团队其他成员的理解。培养良好的 编程习惯,应该从以下几方面开始: 1、代码的缩进; 2、有效使用空格; 3、简明的注释; 4、意义明确的命名; 5、着重表示的常量。二、亲手编写源程序在编写Java 程序过程中,利用一些集成开发环境,可以综合使用Java 的编 译器和调试器, 同时提高程序的编写效率。 比较知名的集成开发环境有: Eclipse、 NetBeans、JBuilder、Visual J++等。虽然使用这些开发工具可以加快编程的速度, 但在学习Java编程初期,最好通过亲手编写源程序,来更好地理解Java语法和编 程思想。三、立即运行程序编写完的源程序要通过上机编译运行,才能检验程序中存在的问题。通过上 机实验可以很好地理解一些系统的方法、变量的含义通过运行的结果。同时通过 对运行结果的分析,可验证程序的功能是否完善,编程目的是否实现。四、实验报告的提交本课程的前六个实验要求提交电子版实验报告, 后两个设计性实验要求提交 电子版与纸质版相结合的实验报告。电子版实验报告的要求如下: 1、实验报告材料包含于一文件夹中,文件夹以“学号”加“姓名”的形式命名, 如“李永富”; 2、 此文件夹下包含各次实验项目的文件夹, 如“实验1、 Java 编程基础”、 “实 验2、Java 基本语法”…; 3、 在实验项目文件夹下, 要求包含两个文件夹和一份Word 2003版的实验报 告。其中,两个文件夹分别为“源代码”和“截图”文件夹,用于存放当次实验使用 的源代码和实验过程截图(要求有6-10幅,格式为Jpeg)。 说明:截图可通过截图抓屏键“Prt Sc”保存在剪贴板里,并复制于画图板中 进行编辑。2 目录实验环境配Z. . . . . . . . . . . . . . . . . . . . . . . ...................... 实验一 Java 编程基础...................... . . .. .. .. .. . .. .. .. . .. .. 实验二 Java 基本语法...................... . . .. .. .. .. . .. .. . . . .. .. 实验三 面向对象编程....................... ...................... 实验四 系统类库调用....................... ...................... 实验五 常用基础类库....................... ...................... 实验六 图形界面编程....................... ...................... 实验七 网络通信编程....................... ...................... 实验八 综合性实验. . . . . . . . . . . . . . . . . . . . . . . ......................3 实验环境配Z一、 JDK 下载与安装1、下载 JDK 为了建立基于 SDK 的 java 运行环境, 需要先下载 JDK 软件包。 JDK 包含了 一整套开发工具, 其中包含对编程最有用的是 Java 编译器、 Applet 查看器和 Java 解释器。 在浏览器中输入 http://java.sun.com 进入 sun 公司官方网站页面, 在页面 右边“Popular Downloads”栏中可看到最新版的 JDK 软件包,并下载。 2、安装 SDK 运行下载的“jdk-6u19-windows-i586.exe”软件包,在安装过程中可以设Z安 装路径及选择组件,默认的组件选择是全部安装,安装成功后,其中 bin 文件夹 中包含编译器(javac.exe) 、解释器(java.exe) 、Applet 查看器(appletviewer.exe) 等可执行文件,lib 文件夹中包含了所有的类库以便开发 Java 程序使用,demo 文件夹中包含开源代码程序实例。 3、JDK 中主要文件夹和文件 安装成功后,“C:\Program Files\Java\JDK1.6.19”中文件和子目录结构如下图 所示。其中 bin 文件夹中包含编译器(javac.exe) 、解释器(java.exe) 、Applet 查 看器(appletviewer.exe)等可执行文件,lib 文件夹中包含了所有的类库以便开发 Java 程序使用,sample 文件夹包含开源代码程序实例,src 压缩文件中包含类库 开源代码。1 4、JAVAC.EXE、JAVAC.EXE 和 APPLETVIEWER.EXE 工具 JDK 中自带了很多有用的工具,其中常用的有:编译器(javac.exe) 、解释 器(java.exe) 、Applet 查看器(appletviewer.exe) 。其使用方法可参看其相应的帮 助信息,帮助信息的调用方法为:在设Z好环境变量的电脑中,调出“命令行提 示符”,分别键入 javac.exe、javac.exe 和 appletviewer.exe 便可看到每一个命令的 使用方法及参数等信息。二、设Z环境变量JDK 中的工具都是命令行工具,需要从命令行即 MS-DOS 提示符下运行它 们。 只有正确设Z好 Java 的环境变量, 才能使用这些命令行工具。 Windows XP 以 为例,说明 Java 环境变量的设Z过程。 1、安装 JDk 到其默认目录,例如“C:\Program Files\Java\jdk1.6.0_19” ; 2、右击我的电脑→属性→高级→环境变量; 3、新建一个环境变量“CLASSPATH”变量值: ; “.” 4、 在系统变量栏中选中变量为“Path”的选项点编辑, 在“变量值”的末尾加入 “;C:\Program Files\Java\jdk1.6.0_19\bin” 。 设Z完成后,单击“开始”-&“所有程序”-&“附件”-&“命令提示符”打开 DOS 窗口,在命令行提示符输入“java”或“javac”回车后,如果出现其用法参数提 示信息,则安装正确。2 三、Eclipse 下载和安装Eclipse 是一个开源的、可扩展的集成开发环境,有着非常强大的功能。在 编码、调试、重构、单元测试等方面的表现都非常优秀。Eclipse 有代码补足、 代码模板的功能,以及对重构、Ant、CVS 和 JUnit 的支持。Eclipse 的源代码是 开放的,可扩展很多插件,包括大量的开源插件和商业插件。 Eclipse 的官方网址是:http://www.eclipse.org。Eclipse 的下载和安装都非常 简单,在其主页点击“Download Eclipse”按钮,便可进入 Eclipse 的下载页面。在 下载页面,有适合不同开发者的 Eclipse 集成开发环境,其中经典 Eclipse 的版本 为 3.5.2。点击适合自己的 Eclipse,便可进入相应的下载页面,选择合适的下载 站点便可实现下载。 将下载后的 Eclipse 解压大合适的文件夹,便完成了 Eclipse 的安装。四、使用命令行编译和运行 java 程序使用命令行编译和运行 Java 程序, 首先需要用文本编辑器编写 Java 源文件。 Windows 系统自带的记事本,就可以用来编辑 Java 的源代码。打开记事本,键 入要编写的代码。3 使用记事本编辑源代码 将编写好的 Java 代码保存在对应的项目文件夹中。将编写好的源代码保存为 Java 文件 Java 源程序编写后,要使用 Java 编译器(javac.exe)进行编译,将 Java 源 程序编译成可执行的程序代码。Java 源程序都是扩展名为.java 的文件。编译时, 首先读入 Java 源程序,然后进行语法检查,如果出现问题就终止编译。 此时,打开命令提示符,输入“javac D:\HelloWorld.java”,编译刚才编写的 Java 文件。4 成功编译 HelloWorld.java 语法检查通过后, 生成可执行程序代码即字节码,字节码文件名和源文件名 相同,扩展名为.class。使用 java.exe 可将编译后的字节码文件 Hello.class 解释为 本地计算机代码。接下来,在命令提示符窗口中,进入 java 源程序所在路径。 键入“java HelloWorld”命令并回车,便可运行刚才编译好的程序。五、使用 Eclipse 编译和运行 Java 程序将 Eclipse 下载并安装后,在 Eclipse 的安装路径下,双击 图标便可 打开 Eclipse 集成开发环境。Eclipse 在启动后会自动检测系统,并配Z相应的参5 数,同时要求用户设Z对应的工作空间。工作空间设Z系统开始启动6 系统启动中系统启动后7 关闭欢迎后的系统界面 Eclipse 启动后,便可进行编程。点击文件菜单中的新建项目,会出现许多 新建类型。项目新建菜单8 点击 Java 项目,输入项目名称“HelloWorld”,系统便会新建一个 Java 项目。新建项目创建卡 点击下一步,会出现新建项目设Z选项卡,一般选择默认设Z即可。9 新建项目设Z卡 点击完成按钮,新项目便会成功创建。10 项目创建后的系统 但此时新项目中不包含任何文件,需要编写相应的程序文件,才能完成整个 项目。点击系统文件菜单的新建按钮,会出现许多新建类型。系统新建菜单11 此时,点击文件按钮,输入要创建的文件名。新建文件创建卡 点击完成按钮后,系统会自动打开该文件,供用户编写程序。12 新建文件编辑窗 键入要编写的代码,并保存。文件编写并保存 接下来将鼠标放于刚才创建的“HelloWorld”项目上, 点击右键选择运行类型,13 会出现一个项目运行类型选择菜单。项目运行选择菜单 点击第二项 Java 应用程序,程序便会运行。程序运行图14 JAVA规范设计类和方法 ==================创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解, 方法是指执行一个统一函数的 一段代码。 类常被错误的视为是一个仅仅用于存放方法的容器。有些开发人员甚 至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中。之所以不 能正确的认识类的功能, 原因之一是类的实现实际上并不影响程序的执行。当一 个工程被编译时, 如果所有方法都放在单个类中或者放在几十个类中,这没有任 何关系。 虽然类的数量对代码的执行并无太大的影响,但是当创建便于调试和维 护的代码时,类的数量有时会带来很大的影响。 类应该用来将相关的方法组织在一起。当类包含一组紧密关联的方法时,该 类可以说具有强大的内聚力。 当类包含许多互不相关的方法时,该类便具有较弱 的内聚力。应该努力创建内聚力比较强的类。 大多数工程都包含许多并不十分 适合与其他方法组合在一起的方法。在这种情况下,可以为这些不合群的方法创 建一个综合性收容类。 创建类时,应知道“模块化”这个术语的含义是什么。类的基本目的是创建相 当独立的程序单元。 创建松散连接和高度专用的方法 1) 所有方法都执行专门的任务 每个方法都应执行一项特定的任务,它应出色的完成这项任务。应避免创建 执行许多不同任务的方法。 创建专用方法有许多好处。 首先调试将变得更加容易。 2) 尽量使方法成为自成一体的独立方法 当一个方法依赖于其他方法的调用时,称为与其他方法紧密连接的方法。紧 密连接的方法会使调试和修改变得比较困难,因为它牵涉到更多的因素。松散连 接的方法优于紧密连接的方法,但你不可能使每个方法都成为独立的方法。 若要使方法具备较强的独立性,方法之一是尽量减少类变量。创建方法时, 设法将每个方法视为一个黑箱,其他例程不应要求了解该方法的内部工作情况, 该方法也不应要求了解它外面的工程情况。 这就是为什么你的方法应依靠参数而 不应依靠全局变量的原因。 3) 创建专用方法时,请考虑下列指导原则: (1) 将复杂进程放入专用方法。如果应用程序使用复杂的数学公式,请考虑 将每个公式放入它自己的方法中。 这样使用这些公式的其他方法就不包含用于该 公式的实际代码。这样也可以更容易发现与公式相关的问题。 (2) 将数据输入/输出(I/O)放入专用方法。 (3) 将专用方法中可能要修改的代码隔离。如果你知道某个进程经常变更, 请将这个多变的代码放入专用方法,以便以后可以更容易的进行修改,并减少无 意中给其他进程带来问题的可能性。15 (4) 将业务规则封装在专用方法中。业务规则常属于要修改的代码类别,应 与应用程序的其余部分隔开。 其他方法不应知道业务规则,只有要调用的方法才 使用这些规则。 4) 设计类和方法时,要达到下列目的: 1) 创建更加容易调试和维护的方法 2) 创建具有强大内聚力的类 3) 创建高度专用的方法 4) 创建松散连接的方法 5) 尽量使方法具有独立性 6) 提高方法的扇入性 7) 降低方法的扇出性编程原则 ==================为方法和类赋予表义性强的名字 为了使代码更加容易理解, 最容易的方法之一是为你的方法赋予表义性强的 名字。函数名 DoIt、GetIt 的可读性很难与 CalculateSalesTax、 RetrieveUserID 相 比。由缩写方法名组成的代码很难理解和维护,没有理由再这样做了。给方法正 确的命名, 可使程序工程的调试和维护工作大大的改观。请认真对待方法命名的 工作,不要为了减少键入操作量而降低方法的可理解度。实际应用举例: 1) 给方法命名时应大小写字母混合使用。如果句子全使用大写字母,那么 阅读起来就非常困难,而大小写字母混合使用的句子,阅读起来就很容易。 2) 定义方法名时不要使用缩写。如果你认为应用程序中的某些工程应使用 缩写, 那么请将这些情况加上注释, 并确保每个人在所有时间内都使用这些缩写。 决不要在某些方法中对某些单词进行缩写,而在别的方法中却不使用缩写。 为每个方法赋予单个退出点 创建方法时,始终都应显式地定义它的作用域 1) 如果你真的想创建一个公用方法,请向代码阅读者说明这一点。 2) 通过为每个方法赋予一个明确定义的作用域,可以减少代码阅读者需要 投入的工作量。 应确保你为方法赋予最有意义的作用域。如果一个方法只被同一 类中的另一个方法调用, 那么请将它创建成私有方法。如果该方法是从多个类中 的多个方法中调用,请将该说明为公用方法。 用参数在方法之间传递数据 应尽量避免使用类变量。一般来说,变量的作用域越小越好。为了减少类变 量, 方法之一是将数据作为参数在不同方法之间传递, 而不是让方法共享类变量。 1) 为每个参数指定数据类型。 2) 始终要对数进行检验,决不要假设你得数据没有问题。程序员常犯的一 个错误是在编写方法时假设数据没有问题。 在初始编程阶段, 当编写调用方法时, 这样的假设并无大碍。 这时你完全能够知道什么是参数的许可值,并按要求提供 这些值。 但如果你不对参数的数据进行检验,那么下列情况就会给你带来很大麻16 烦:另外某个人创建了一个调用方法,但此人不知道允许的值;你在晚些时候添 加了新的调用方法,并错误的传递了坏数据。命名约定 ==================变量的定义 变量的定义应该遵循匈牙利命名法,它使用 3 字符前缀来表示数据类型,3 个字符的前缀必须小写, 前缀后面是由表意性强的一个单词或多个单词组成的名 字,而且每个单词的首写字母大写,其它字母小写,这样保证了对变量名能够进 行正确的断句。 这样,在一个变量名就可以反映出变量类型和变量所存储的值的 意义两方面内容,这使得代码语句可读性强、更加容易理解。 包、类及方法命名 1) 包 全部小写。标识符用点号分隔开来。为了使包的名字更易读,Sun 公司建 议包名中的标识符用点号来分隔。 Sun 公司的标准 java 分配包用标识符 .java 开头。 全局包的名字用你的机构的 Internet 保留域名开头 。 局部包:interface.screens 全局包:com.rational.www. interface.screens 2) 类,接口 类的名字应该使用名词。 每个单词第一个字母应该大写。 避免使用单词的缩写,除非它的缩写已经广为人知,如 HTTP。 Class H Class HelloW Interface A 3) 方法 第一个单词一般是动词。 第一个字母是小些,但是中间单词的第一个字母是大写。 如果方法返回一个成员变量的值, 方法名一般为 get+成员变量名, 如若返回 的值是 bool 变量,一般以 is 作为前缀。 如果方法修改一个成员变量的值,方法名一般为:set + 成员变量名。 getName();setName();isFirst(); 4) 变量 第一个字母小写,中间单词的第一个字母大写。 不要用_或&作为第一个字母。 尽量使用短而且具有意义的单词。 单字符的变量名一般只用于生命期非常短暂的变量。i,j,k,m,n 一般用于 integers;c,d,e 一般用于 characters。 如果变量是集合,则变量名应用复数。 命名组件采用匈牙利命名法,所有前缀均应遵循同一个组件名称缩写列表。17 String myN int[] btN (bt 是 Button 的缩写) 5) 常量 所有常量名均全部大写,单词间以?_?隔开。int MAX_NUM; 6) 其它 开发人员如果遇到上述表格中未列举的类型,请书面通知相关管理人员,由 管理人员集中更新列表内容,不得擅自启用未经确定的新变量前缀。MVC 规范 ==================MVC 是 Model,View,Controller 的缩写,MVC 是 Application 开发的设计模式, 也就是大家所知道的 Model2.在 MVC 的设计模式中,要求在 Application 开发中你 把商业逻辑,界面显示,数据分离。也就是分别在 Model,View,Controller 实现: 数据,控制(商业逻辑)显示(页面显示).在以前或者说传统的 Web Application 开发方式当中, Asp,Php,Jsp(Model 1)开发当中我们在 Asp(Php,Jsp)中实现一切, 如 如: 从数据库中取到我们需要的数据,并根据数据之间的关联和实际的需要按照 某种方式把他显示在页面中以及从页面提交的表单中提取数据, 根据商业逻辑从 数据库查询相关数据,或者把数据写入数据库。也就是说我们在 Asp(Php,Jsp)实 现一切包括:界面显示,商业逻辑,数据存取。这样带来的后果就是你所写的 Asp(Php,Jsp) 没有层次,并且 Html 和 Script(JavaScript、JScript,Asp、Php、Jsp 源代码)相 互嵌套.可维护性差,最要命的是在 Web Application 通常显示一块是由美工完成 的,很多时候也是你先写好 Asp、Php、Jsp 然后美工进行美化,很有可能你发现 经过美工处理完以后你的代码已经面目全非了。你不得不把你的代码重新组织。 在 MVC 模式中这个问题的解决办法是: View 中负责显示, View 一般从 Controller 得到已经处理过的数据,然后显示在页面当中,应该说这样在 Html 中嵌套很少 的 Script.基本上美工的修改不大会废掉你的劳动成果。 MVC 模式的好处: 1) 各施其职,互不干涉 在 MVC 模式中, 三个层各施其职, 所以如果一旦哪一层的需求发生了变化, 就只需要更改相应的层中的代码而不会影响到其它层中的代码。 假如业务发生了 变化,如在取文章时可能 webmaster 把一些文章作了无效标志,不能直接把所有 文章取出来,只能取出有效的文章,这时业务就发生了改变。再设想一下,如果 这个业务逻辑在 100 个页面中都要用到,那么 MVC 模式就体现了它的灵活性。 我们可以不更改任何 JSP,只要更改 model 层中的相应类中的 SQL 语句即可。 2) 有利于开发中的分工 在 MVC 模式中,由于按层把系统开,那么就能更好的实现开发中的分工。 网页设计人员可以进行开发视图层中的 JSP,对业务熟悉的开发人员可开发业务 层,而其它开发人员可开发控制层。 3) 有利于组件的重用 分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视力层也18 可做成通用的操作界面。 MVC 的具体规范为: 分层 在 MVC 的设计模式中,要求在 Application 开发中你把商业逻辑,界面显示, 数据分离。也就是分别在 Model,View,Controller 实现:数据,控制(商业逻辑) 显示(页面显示) 。 规则 1) 用户的所有请求统一由控制器截获 2) 控制器根据请求种类,调用不同的业务对象(业务 bean),根据业务对象 的返回值,来决定该把哪个页面相应给用户 3) 在 jsp 中,不会出现任何业务代码/数据库操作。可以有实例化 bean 的操 作,或者从 session、数据 bean 中取得数据 4) 在作为控制器的 servlet 中不会出现网页内容、业务代码、数据库操作。 可以有接受 request 值、实例化 bean、调用 bean 的方法、页面转移 5) 数据 bean 对应数据库中某张表里的一条记录,这张表中的所有列都应该 成为数据 bean 的私有属性 6) 业务 bean 在 Controller(servlet)中实例化 7) 数据 bean 在业务 bean 或 Controller 中实例化其它规范 ==================Java 文件样式 所有的 Java(*.java) 文件都必须遵守如下的样式规则 1) 版权信息 版权信息必须在 java 文件的开头,比如: /** * Copyright & 2000 Shanghai XXX Co. Ltd. * All right reserved. */ 其他不需要出现在 javadoc 的信息也可以包含在这里。 2) Package/Imports package 行要在 import 行之前,import 中标准的包名要在本地的包名之 前, 而且按照字母顺序排列。 如果 import 行中包含了同一个包中的不同子目录, 则应该用 * 来处理。 package hotlava.net. import java.io.*; import java.util.O import hotlava.util.A 这里 java.io.* 使用来代替 InputStream and OutputStream 的。 3) Class (1) 类的注释 接下来的是类的注释,一般是用来解释类的。 /**19 * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */ (2) 类定义 (3) 类的成员变量 接下来是类的成员变量: /** * Packet counters */ protected int[] public 的成员变量必须生成文档(JavaDoc)。 proceted、private 和 package 定义的成员变量如果名字含义明确的话,可以 没有注释。 (4) 构造函数 接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。 (5) 类方法 下面开始写类的方法: /** * Set the packet counters * (such as when restoring from a database) */ protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException { // // Ensure the arrays are of equal size // if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length) throw new IllegalArgumentException(&Arrays must be of the same size&); System.arraycopy(r1, 0, r3, 0, r1.length); System.arraycopy(r2, 0, r4, 0, r1.length); } 数组的命名 数组应该总是用下面的方式来命名: byte[] 而不是: byte buffer[]; 垃圾收集 JAVA 使用成熟的后台垃圾收集技术来代替引用计数。但是这样会导致一个 问题: 你必须在使用完对象的实例以后进行清场工作。 比如一个 prel 的程序员可 能这么写: { FileOutputStream fos = new FileOutputStream(projectFile); project.save(fos, &IDE Project File&);20 } ... 除非输出流一出作用域就关闭,非引用计数的程序语言,比如 JAVA,是不 能自动完成变量的清场工作的。必须象下面一样写: FileOutputStream fos = new FileOutputStream(projectFile); project.save(fos, &IDE Project File&); fos.close(); 性能 在写代码的时候, 从头至尾都应该考虑性能问题。这不是说时间都应该浪费 在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有 时间来实现一个高效的算法, 那么我们应该在文档中记录下来,以便在以后有空 的时候再来实现她。 不是所有的人都同意在写代码的时候应该优化性能这个观点 的, 他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓 已经实现了以后。 1) 使用 StringBuffer 对象 在处理 String 的时候要尽量使用 StringBuffer 类, StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为 开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作, 当工作完成后将 StringBuffer 对象再转换为需 要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完 成构造,那么我们应该使用 StringBuffer 对象和她的 append()方法。如果我们用 String 对象代替 StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。 2) 避免太多的使用 synchronized 关键字 避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是 一个避免死锁的好方法。21 实验一Java 编程基础〖开发语言及实现平台或实验环境〗Windows XP、JDK 1.6 与 Eclipse 3.5〖实验目的〗1、掌握下载 Java SDK 软件包、Eclipse 等软件的方法 2、掌握设Z Java 程序运行环境的方法 3、掌握命令行下下编写与运行 Java 程序的方法 4、掌握 Eclipse 环境中编写与运行 Java 程序的方法 5、了解 Java 语言的概貌,掌握 Java 语言的正确书写格式。〖实验要求〗1、JDK 的下载与安装 2、设Z环境变量 3、使用 Eclipse 3.5 4、编译 Java 源程序 5、运行 Java 程序 6、使用 Eclipse 编译与运行程序〖实验内容〗 一、安装和配Z Java 开发环境1、安装和配Z Java 开发环境,并记录安装和配Z全过程。二、编写和编译 Java Application1、编写声明不同数据类型变量的程序文件,源代码如下。public class HelloWorld { public static void main(String[] args) { System.out.println(&HelloWorld!&); } }2、使用命令行工具和 Eclipse 开发环境分别编译并运行该程序,并记录实验 全过程。三、编写和编译 Java Applet1、使用命令行工具和 Eclipse 开发环境分别编译和运行下面的 Java Applet。import java.awt.G import java.applet.A22 public class HelloWorldApp extends Applet{ public S public void init() { s=new String(&HelloWorldApp!&); } public void paint(Graphics g){ g.drawString(s,25,25); } }2、使用命令行工具和 Eclipse 开发环境分别编译并运行该程序,并记录实验 全过程。〖课后思考〗1、环境变量 path 和 classpath 的作用。 2、在 Eclipse 中如何配Z java 编译和运行环境23 实验二Java基本语法〖开发语言及实现平台或实验环境〗Windows XP、JDK 1.6 与 Eclipse 3.5〖实验目的〗1、了解 Java 的数据类型 2、掌握各种变量的声明方式 3、理解运算符的优先级 4、掌握 java 基本数据类型。运算符与表达式、数组的使用方法 5、理解 Java 程序语法结构,掌握顺序结构、选择结构和循环结构语法的程 序设计方法〖实验要求〗1、编写一个声明 java 不同数据类型变量的程序 2、编写一个使用运算符、表达式、变量的程序 3、编写一个使用 java 数据的程序 4、编写表达式语句、复合语句的程序 5、编写使用不同选择结构的程序 6、编写使用不同循环结构的程序〖实验内容〗 一、声明不同数据类型的变量1、编写声明不同数据类型变量的程序文件,源代码如下。public class shujuleixing { public static void main(String args[]) { byte b = 0x55; short s = 0x55 int i = 1000000; long l = 0xffffL; char c = 'a'; float f = 0.23F; double d = 0.7E-3; boolean B = String S = &这是字符串类数据类型&; System.out.println(&字节型变量 b = & + b); System.out.println(&短整型变量 s = & + s); System.out.println(&整型变量24i = & + i);System.out.println(&长整型变量 l = & + l); System.out.println(&字符型变量 c = & + c); System.out.println(&浮点型变量 f = & + f); System.out.println(&双精度变量 d = & + d); System.out.println(&布尔型变量 B = & + B); System.out.println(&字符串类对象 S = & + S); } }2、使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实验 全过程。二、使用关系运算符和逻辑运算符1、建立使用关系运算符和逻辑运算符的程序文件,源代码如下。class yunsuanfu { public static void main(String args[]) { int a = 25, b = 20, e = 3, f = 0; boolean d = a & System.out.println(&a=25,b=20,e=3,f=0&); System.out.println(&因为关系表达式 a&b 为假,所以其逻辑值为 : & + d); if (e != 0 && a / e & 5) System.out.println(&因为e 非0 且a/e 为8 大于5, 所以输出 a/e= & + a / e); if (f != 0 && a / f & 5) System.out.println(&a/f = & + a / f); else System.out.println(&因为f值为0,所以输出 f = & + f); } }2、使用命令行工具和 Eclipse 开发环境分别编译并运行该程序,并记录实验 全过程。三、使用数组1.建立使用数组的程序,本程序建立了一个长度为5 的1 维数组,一个长 度为12 的2 维数组,源代码如下。public class shuzu { public static void main(String args[]) { int a[] = new int[5]; int arr1[][] = new int[3][4]; a[0] = 10; a[1] = 10 + a[0]; a[2] = 30;25 a[3] = 40; a[4] = a[1] + a[2]; arr1[0][0] = 0; arr1[0][1] = 1; arr1[0][2] = 2; arr1[1][0] = 3; arr1[1][1] = 4; arr1[1][2] = 5; arr1[2][0] = 6; arr1[2][1] = 7; arr1[2][2] = 8; System.out.println(&a[& + 0 + &] = & + a[0]); System.out.println(&a[& + 1 + &] = & + a[1]); System.out.println(&a[& + 2 + &] = & + a[2]); System.out.println(&a[& + 3 + &] = & + a[3]); System.out.println(&a[& + 4 + &] = & + a[4]); System.out.println(&arr1(& + 0 + &,& + 0 + &) = & + arr1[0][0]); System.out.println(&arr1(& + 0 + &,& + 1 + &) = & + arr1[0][1]); System.out.println(&arr1(& + 0 + &,& + 2 + &) = & + arr1[0][2]); System.out.println(&arr1(& + 1 + &,& + 0 + &) = & + arr1[1][0]); System.out.println(&arr1(& + 1 + &,& + 1 + &) = & + arr1[1][1]); System.out.println(&arr1(& + 1 + &,& + 2 + &) = & + arr1[1][2]); } }2、使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实验 全过程。四、使用表达式语句与复合语句1、建立包含表达式语句程序,源代码如下。class biaodashiyuju { public static void main(String[] args) { int k, i = 3, j = 4; k = 20 * 8 / 4 + i + j * System.out.println(&表达式(20*8/4+i+j*i)=& + k); } }2、建立包含复合语句程序,源代码如下。class fuheyuju { public static void main(String args[]) { int k, i = 3, j = 4;26 k = i + System.out.println(&在复合块外的输出 k=& + k); { f = j + 4.5F; i++; System.out.println(&在复合块内的输出 f=& + f); System.out.println(&在复合块内的输出 k=& + k); } System.out.println(&在复合块外的输出 i=& + i); } }2、使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实验 全过程。五、使用选择语句1、使用if...else 语句 (1)程序功能:使用if...else 语句构造多分支,判断某一年是否为闰年。闰 年的条件是符合下面二者之一:能被4 整除,但不能被100 整除;能被4 整除, 又能被100 整除。 (2)编写源程序文件,代码如下。public class xuanzeyuju1 { public static void main(String args[]) { int year = 2005; if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // 方法1 System.out.println(year + & 年是闰年&); else System.out.println(year + & 年不是闰年&); year = 2008; // 方法2 if (year % 4 != 0) leap = else if (year % 100 != 0) leap = else if (year % 400 != 0) leap = else leap = if (leap == true) System.out.println(year + & 年是闰年&); else27 System.out.println(year + & 年不是闰年&); year = 2050; // 方法3 if (year % 4 == 0) { if (year % 100 == 0) { if (year % 400 == 0) leap = else leap = } else leap = } else leap = if (leap == true) System.out.println(year + & 年是闰年&); else System.out.println(year + & 年不是闰年&); } }(3)使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实 验全过程。 2、使用switch 语句 (1)程序功能:在不同温度时显示不同的解释说明。 (2)程序源代码如下。class xuanzeyuju2 { public static void main(String args[]) { int c = 38; switch (c & 10 ? 1 : c & 25 ? 2 : c & 35 ? 3 : 4) { case 1: System.out.println(& & + c + &℃ 有点冷。要多穿衣服。&); case 2: System.out.println(& & + c + &℃ 正合适。出去玩吧。&); case 3: System.out.println(& & + c + &℃ 有点热。&); default: System.out.println(& & + c + &℃ 太热了!开空调。&); } } }(3)使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实28 验全过程。六、使用循环语句1、for 循环语句练习 (1) 程序功能: 按5 度的增量打印出一个从摄氏温度到华氏温度的转换表。 (2) 程序源代码如下。class xunhuanyuju1 { public static void main(String args[]) { int h, System.out.println(&摄氏温度 华氏温度&); for (c = 0; c &= 40; c += 5) { h = c * 9 / 5 + 32; System.out.println(& & + c + & & + h); } } }(3)使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实 验全过程。 2、while 循环语句练习 (1)程序功能:运行程序后从键盘输入数字1/2/3 后,可显示抽奖得到的奖 品;如果输入其它数字或字符显示“没有奖品给你!”。 (2)程序源代码如下。import java.io.*; class xunhuanyuju2 { public static void main(String args[]) throws IOException { System.out.println(&按 1/2/3 数字键可得大奖!&); System.out.println(&按空格键后回车可退出循环操作.&); while ((ch = (char) System.in.read()) != ' ') { System.in.skip(2); // 跳过回车键 switch (ch) { case '1': System.out.println(&恭喜你得大奖,一辆汽车!&); case '2': System.out.println(&不错呀,你得到一台笔记本电脑!&); case '3': System.out.println(&没有白来,你得到一台冰箱!&);29
default: System.out.println(&真不幸,你没有奖品!下次再来吧。&); } } } }(3)使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实 验全过程。 3、do…while 循环语句练习 (1) 程序功能:求1+2+…+100 之和,并将求和表达式与所求的和显示 出来。 (2) 程序源代码如下。class xunhuanyuju3 { public static void main(String args[]) { int n = 1, sum = 0; do { sum += n++; } while (n &= 100); System.out.println(&1+2+...+100 =& + sum); } }(3)使用命令行工具和Eclipse开发环境分别编译并运行该程序,并记录实 验全过程。〖课后思考〗1、程序的复合结构以及变量的使用范围 2、选择语句,哪些具有嵌套关系? 3、while和do…while的区别。30 实验三 面向对象编程〖开发语言及实现平台或实验环境〗Windows XP、JDK 1.6与Eclipse 3.5〖实验目的〗1、理解Java语言是如何体现面向对象编程基本思想, 2、了解类的封装方法,以及如何创建类和对象, 3、了解成员变量和成员方法的特性。 4、掌握OOP方式进行程序设计的方法, 5、了解类的继承性和多态性的作用。〖实验要求〗1、编写一个体现面向对象思想的程序。 2、编写一个创建对象和使用对象的方法程序。 3、编写不同成员变量修饰方法的程序。 4、编写不同成员方法修饰的程序。 5、编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序。 6、编写体现类多态性(成员方法重载,构造方法重载)的程序。〖实验内容〗 一、创建Applet 应用小程序1、创建一个Applet应用程序文件。 (1)程序功能:建立一个Applet小程序,使其可以进行简单的加法运算。 该程序要包含类、接口、属性、方法、事件等面向对象的基本元素。 (2)程序源代码如下。import java.awt.*; import java.awt.event.*; import java.applet.A public class Applet1 extends Applet implements ActionListener { Label label1 = new Label(&+&); Label label2 = new Label(&=&); TextField field1 = new TextField(6); TextField field2 = new TextField(6); TextField field3 = new TextField(6); Button button1 = new Button(&相加&);31 public void init() { // 初始化 add(field1); add(label1); add(field2); add(label2); add(field3); add(button1); button1.addActionListener(this); } public void actionPerformed(ActionEvent e) { // 处理按钮事件 int x = Integer.parseInt(field1.getText()) + Integer.parseInt(field2.getText()); field3.setText(Integer.toString(x)); // 数值转换为字符串 } }2、编写一个浏览Applet应用程序的页面文件Applet1.HTML,源代码如。&html& &applet code=&Applet1.class& height=200 width=400& &/applet& &/html&3、将Applet1.java 源程序编译为Applet1.class文件 4、使用浏览器或使用小程序查看器浏览Applet1.HTML文件(即在命令提示 符窗口输入:appletviewer Applet1.HTML)。二、创建对象并使用对象1、编写Applet 程序 (1)程序功能:这个Applet程序要在页面上输出两个矩形,并伴有文字输 出。 (2)Applet2.java程序的源代码如下。import java.awt.*; import java.applet.A public class Applet2 extends Applet { MyBox b1 = new MyBox();// 创建对象b1 MyBox b2 = new MyBox(170, 20, 60, 60); // 创建对象b2 public void paint(Graphics g) { b1.setPosition(20, 20); b1.setSize(60, 60); b1.draw(g);32 g.drawString(&矩形 1 的 X 位置: & + b1.getX(), 20, 100); g.drawString(&矩形 1 的 Y 位置: & + b1.getY(), 20, 120); b2.draw(g); g.drawString(&矩形 2 的 X 位置: & + b2.getX(), b2.getX(), b2.getY() + 80); g.drawString(&矩形 2 的 Y 位置: & + b2.getY(), b2.getX(), b2.getY() + 100); } } class MyBox { private int x, y, width, MyBox() { x = 0; y = 0; width = 0; height = 0; } MyBox(int xPos, int yPos, int w, int h) { x = xP y = yP width = height = } public void setPosition(int xPos, int yPos) { x = xP y = yP } public void setSize(int w, int h) { width = height = } public int getX() { } public int getY() { }33 public void draw(Graphics g) { g.drawRect(x, y, width, height); } }2、编写一个浏览Applet 应用程序的页面文件Applet2.HTML。&html& &applet code=&Applet2.class& height=200 width=400& &/applet& &/html&3、将Applet2.java 源程序编译为Applet2.class 文件 4、使用浏览器或使用小程序查看器浏览Applet2.HTML 文件(即在命令提 示符下输入:appletviewer Applet2.HTML)。三、使用修饰符有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这 时可以使用修饰符来实现这个目的。 常用的修饰符有:[public] [private] [protected] [package] [static] [final] [transient] [volatile],不同修饰符的访问控制权限如下表所示。1、程序功能:通过两个类StaticDemo、JAVA_B_3_1 说明静态变量/方法与 实例变量/方法的区别。 2、编写类文件JAVA_B_3_1.java,程序源代码如下。class StaticDemo { public static int getX() { } public static void setX(int newX) { x = newX;34 } public int getY() { } public void setY(int newY) { y = newY; } } public class JAVA_B_3_1 { public static void main(String[] args) { System.out.println(&静态变量x=& + StaticDemo.getX()); System.out.println(&实例变量y=& + StaticDemo.getY()); // 非法,编 译时将出错 StaticDemo a = new StaticDemo(); StaticDemo b = new StaticDemo(); a.setX(1); a.setY(2); b.setX(3); b.setY(4); System.out.println(&静态变量a.x=& + a.getX()); System.out.println(&实例变量a.y=& + a.getY()); System.out.println(&静态变量b.x=& + b.getX()); System.out.println(&实例变量b.y=& + b.getY()); } }3、对上面的源程序进行编译,会出现错误。 4、将源程序中的出错语句删除或使用解释符//隐藏起来,例如,//System.out.println(&实例变量y=&+StaticDemo.getY());5、重新编译并运行该程序,记录程序运行过程。 static 声明的成员变量/方法被视为类的成员变量/方法,而不把它当作实例 对象的成员变量/方法。换句话说,静态变量/方法是类固有的,可以直接引用, 其它成员变量/方法仅仅被声明,生成实例对象后才存在,才可以被引用。基于 这样的事实,也把静态变量/方法称为类变量/方法,非静态变量称为实例变量/ 方法。 从实验结果可以得出以下几点结论: ? 类的静态变量可以直接引用,而非静态变量则不行。类的静态变量相当于 某些程序语言的全局变量。 ? 静态方法只能使用静态变量,不能使用实例变量。因为对象实例化之前, 实例变量不可用。35 ? 类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。 ? 对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。四、方法中参数传递的练习在其它语言中,函数调用或过程调用时参数有传值调用和传地址调用之分。 在Java 中,方法中的参数传递可以分为传值调用或对象方法调用等方式。传值 调用即传递的参数是基本数据类型,调用方法时在方法中将不能改变参数的值, 这意味着只能使用它们。对象调用是指先调用对象,再调用对象的方法,这种方 式可以修改允许存取的成员变量。所以,如果不想改变参数的值,可以采用传值 调用的方法。 如果想改变参数的值, 可采用对象调用的方法, 间接修改参数的值。 1、编写一个传值调用的程序文件JAVA_B_3_2.java。 (1)程序功能:程序首先给整型变量x 和y 赋一个初值10,然后使用传值 调用方式调用方法ff1对x 和y 做乘方及输出x 和y 的乘方值,最后再输出x 和y 的乘方值。 (2)程序源代码如下。class JAVA_B_3_2 { public static void main(String[] args) { int x = 10, y = 10; ff1(x, y); System.out.println(&x=& + x + &, y=& + y); } static void ff1(int passX, int passY) { passX = passX * passX; passY = passY * passY; System.out.println(&passX=& + passX + &, passY=& + passY); } }(3)编译JAVA_B_3_2.java,记录并分析其运行结果。 这个程序没有实现预期的结果,原因是ff1 方法采用了传值调用。调用ff1方 法时,将产生两个参数passX和passY,x和y的值被传递给这两个参数。尽管在方 法中计算了参数的平方,但从ff1方法返回后,参数消失,此时x和y的值仍是初 值。 2、编写一个调用对象方法的程序文件JAVA_B_3_3.java。 (1)程序功能:通过调用对象的方法在方法调用后修改了成员变量的值。 (2)JAVA_B_3_3.java 程序源代码如下。class JAVA_B_3_3 { public static void main(String[] args) { Power p = new Power();36 p.ff2(10, 10); System.out.println(&方法调用后 x=& + p.x + &, y=& + p.y); } } class Power { int x = 10, y = 10; void ff2(int passX, int passY) { System.out.println(&初始时 x=& + x + &, y=& + y); x = passX * passX; y = passY * passY; System.out.println(&方法调用中 x=& + x + &, y=& + y); } }(3)编译JAVA_B_3_3.java,记录并分析其运行结果。五、类的继承性练习1、进一步理解继承的含义 新类可从现有的类中产生, 并保留现有类的成员变量和方法并可根据需要对 它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。 当建立一个新类时, 不必写出全部成员变量和成员方法。只要简单地声明这 个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承 的类称为父类或超类(superclass),这个新类称为子类。 Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公 用的目的, 因此很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际 问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通 常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具 特殊性,代表着一组更具体的对象。继承的意义就在于此。 2、创建公共类JAVA_B_3_4P (1)编写程序文件JAVA_B_3_4P.java,源代码如下。public class JAVA_B_3_4P { protected S // 具有保护修饰符的成员变量 void setdata(String m, int h) // 设置数据的方法 { xm = xh = }37 public void print() // 输出数据的方法 { System.out.println(xm + &, & + xh); } }(2)编译JAVA_B_3_4P.java,产生类文件JAVA_B_3_4P.class。 3、创建继承的类 (1)程序功能:通过JAVA_B_3_4P 类产生子类JAVA_B_3_5,其不仅具有 父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、 xi(系)。在程序中调用了父类的print方法,同时可以看出子类也具有该方法。 (2)编写JAVA_B_3_5.java 程序,源代码如下。class JAVA_B_3_5 extends JAVA_B_3_4P { protected S protected S public static void main(String args[]) { JAVA_B_3_4P p1 = new JAVA_B_3_4P(); p1.setdata(&帅零&, 12321); p1.print(); JAVA_B_3_5 s1 = new JAVA_B_3_5(); s1.setdata(&郭丽娜&, 12345); // 调用父类的成员方法 s1.xy = &经济管理学院&; // 访问本类的成员变量 s1.xi = &信息管理系&; // 访问本类的成员变量 s1.print(); System.out.print(s1.xm + &, & + s1.xy + &, & + s1.xi); } }(3)编译并运行程序,记录并分析其运行结果。 3、了解成员变量的隐藏方式 所谓隐藏是指子类重新定义了父类中的同名变量, 在子类Line中重新定义了 x 为x1,y 为y1,隐藏了父类Point 中的两个成员变量x和y。子类执行自己的方 法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。在 子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这 有可能给程序带来麻烦。 4、了解成员方法的覆盖方式 (1)方法覆盖的定义与作用 通过继承子类可以继承父类中所有可以被子类访问的成员方法, 但如果子类 的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简38 称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。 例如,子类可以修改层层继承下来的Object 根类的toString 方法,让它输出一些 更有用的信息。下面的程序显示了在子类Circle 中添加toString 方法,用来返回 圆半径和圆面积信息。 (2) 编写覆盖Object 类toString 方法的程序文件JAVA_B_3_6.java, 源代码 如下。class Circle { Circle(int r) { setRadius(r); } public void setRadius(int r) { radius = } public int getRadius() { } public double area() { return 3.14159 * radius * } public String toString() { return &圆半径:& + getRadius() + & 圆面积:& + area(); } } public class JAVA_B_3_6 { public static void main(String args[]) { Circle c = new Circle(10); System.out.println(&\n& + c.toString()); } }(3)编译并运行程序,记录并分析程序结构及其运行结果。 5、This、super和super()的使用 (1)程序功能:说明this、super 和super()的用法。程序首先定义Point(点) 类,然后创建点的子类Line(线)。最后通过JAVA_B_3_7类输出线段的长度。 程序中通过super(a,b)调用父类Point 的构造方法为父类的x 和y 赋值。在子39 类Line的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使 用this引用,告诉编译器是为当前类的成员变量赋值。在length和toString方法中 使用父类成员变量时,使用super引用,告诉编译器使用的是父类的成员变量。 (2)使用this、super和super()的程序文件JAVA_B_3_7.java,源代码如下。class Point { protected int x, Point(int a, int b) { setPoint(a, b); } public void setPoint(int a, int b) { x = y = } } class Line extends Point { protected int x, Line(int a, int b) { super(a, b); setLine(a, b); } public void setLine(int x, int y) { this.x = x + this.y = y + } public double length() { int x1 = super.x, y1 = super.y, x2 = this.x, y2 = this.y; return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } public String toString() { return &直线端点:[& + super.x + &,& + super.y + &] [& + x + &,& + y + &] 直线长度:& + this.length(); } } public class JAVA_B_3_7 {40 public static void main(String args[]) { Line line = new Line(50, 50); System.out.println(&\n& + line.toString()); } }(3)编译并运行程序,记录、分析程序结构及其运行结果。六、类的多态性练习1、理解类的多态性 类的继承发生在多个类之间, 而类的多态只发生在同一个类上。 在一个类中, 可以定义多个同名的方法, 只要确定它们的参数个数和类型不同。这种现象称为 类的多态。 多态使程序简洁,为程序员带来很大便利。在OOP中,当程序要实现多个相 近的功能时, 就给相应的方法起一个共同的名字, 用不同的参数代表不同的功能。 这样, 在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结 果。 类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的 重载。 2、方法的重载 方法的重载是指对同名方法的不同使用方式。 (1)程序功能:在IntSort类中定义3个同名的方法sort,对不同的数进行排 序输出。 (2)编写JAVA_B_3_8.java文件,源代码如下。import java.awt.G import java.applet.A class IntSort { public String sort(int a, int b) { if (a & b) return a + & & + else return b + & & + } public String sort(int a, int b, int c) { if (a&b) { swap=a; a=b; b=41 } if (a&c) { swap=a; a=c; c= } if (b&c) { swap=b; b=c; c= } return a+& &+b+& &+c; } public String sort(int arr[]) { String s = & &; for (int i = 0; i & arr. i++) for (int j = 0; j & arr.length - 1; j++) if (arr[j] & arr[j + 1]) { swap = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = } for (int i = 0; i & arr. i++) s = s + arr[i] + & &; } } public class JAVA_B_3_8 extends Applet { IntSort s = new IntSort(); public void paint(Graphics g) { int a = 30, b = 12, c = 40; int arr[] = { 34, 8, 12, 67, 44, 98, 52, 23, 16, 16 }; g.drawString(&两个数的排序结果:& + s.sort(a, b), 30, 30); g.drawString(&三个数的排序结果:& + s.sort(a, b, c), 30, 60); g.drawString(&数组的排序结果:& + s.sort(arr), 30, 90); } }(3)、将JAVA_B_3_8.java 源程序编译为JAVA_B_3_8.class 文件,编写一 个浏览Applet 应用程序的页面文件JAVA_B_3_8.HTML。42 &html& &applet codebase=e:/java/程序 code=JAVA_B_3_8.class width=420 height=380& &/applet & &/html&(4)、使用浏览器或使用小程序查看器浏览JAVA_B_3_8.HTML 文件(即 在命令提示符下输入:appletviewer JAVA_B_3_8.ML) 3、构造方法的重载 构造方法的名称和类同名, 没有返回类型。尽管构造方法看起来和一般的成 员方法没有差别,但它不是方法,也不是类的成员。因此,构造方法不能直接调 用,只能由new操作符调用。 构造方法对于类是十分重要的,对象的初始化任务要靠构造方法来完成。 重载构造方法的目的是提供多种初始化对象的能力, 使程序员可以根据实际 需要选用合适的构造方法来初始化对象。 (1)编写构造方法RunDemo的重载程序文件JAVA_B_3_9,源代码如下。class RunDemo { private String userName, RunDemo() { System.out.println(&全部为空!&); } RunDemo(String name) { userName = } RunDemo(String name, String pwd) { this(name); password = check(); } void check() { String s = if (userName != null) s = &用户名:& + userN else s = &用户名不能为空!&; if (password != &&) s = s + & 口令无效!&; else s = s + & 口令:********&; System.out.println(s);43 } } public class JAVA_B_3_9 { public static void main(String[] args) { new RunDemo(); new RunDemo(&刘新宇&); new RunDemo(null, &邵丽萍&); new RunDemo(&张驰&, &&); } }(2)编译并运行程序,记录并分析程序结构及其运行结果。〖课后思考〗1、如何创建applet 小程序?需要注意哪些问题? 2、程序的结构。类与对象的关系。对象创建、使用、销毁的过程。 3、方法的参数传递有哪些方式?区别时什么? 4、说明什么是构造方法。 5、说明程序中有多个类时如何确定源程序文件的名称。 6、说明类的继承和多态有什么作用,在使用上应该注意什么问题。44 实验四 系统类库调用〖开发语言及实现平台或实验环境〗Windows XP、JDK 1.6与Eclipse 3.5〖实验目的〗1、ava 中包(package)、接口(interface)和异常处理(exception)的作用。 2、接口、异常处理的设计方法。〖实验要求〗1、了解Java 系统包的结构。 2、掌握创建自定义包的方法。 3、掌握使用系统接口的技术和创建自定义接口的方法。 4、理解系统异常处理的机制和创建自定义异常的方法。〖实验步骤〗 一、了解并使用 Java 的系统包1、API包、接口、异常处理的作用 包是类和接口的集合。利用包可以把常用的类或功能相似的类放在一个包 中。Java语言提供系统包,其中包含了大量的类,可以在编写Java程序时直接引 用它们。为便于管理和使用它们,将这些类分为了不同的包。包又称类库或API 包,所谓API(Application Program Interface)即应用程序接口。API包―方面提 供丰富的类与方法供大家使用,如画图形、播放声音等,另一方面又负责和系统 软硬件打交道,圆满实现用户程序的功能。所有Java API包都以“java.”头,以区 别用户创建的包。 接口解决了Java不支持多重继承的问题,可以通过实现多个接口达到与多重 继承相同的功能。 处理程序运行时的错误和设计程序同样重要, 只有能够完善处理运行时出错 的程序, 软件系统才能长期稳定地运行,异常处理就是说明如何处理程序运行时 出错的问题。 2、上网浏览Java API 文档 在地址http://java.sun.com/上,可以看到Java系统提供的Java API文档,类文 档的内容主要是:类层次、类及用途描述、成员变量列表、构造方法列表、成员 方法列表、从类层次上继承的方法列表、成员变量的详细说明、构造方法详细说 明、成员方法详细说明。在这里可以看到Java提供的Java API文档的最新内容二、创建并使用自定义包45 1、自定义包的声明方式 &package& &自定义包名& 声明包语句必须添加在源程序的第一行, 表示该程序文件声明的全部类都属 于这个包。 2、创建自定义包Mypackage 在 存 放 源 程 序 的 文 件 夹 中 建 立 一 个 子 文 件 夹 Mypackage 。 例 如 , 在 “E:\javademo” 文 件 夹 之 中 创 建 一 个 与 包 同 名 的 子 文 件 夹 Mypackage (E:\javademo\Mypackage),并将编译过的class 文件放入该文件夹中。注意: 包名与文件夹名大小写要一致。再添加环境变量 classpath 的路径,例如: D:\java\jdk1.6\ E:\javademo 3、在包中创建类 (1)YMD.java程序功能:在源程序中,首先声明使用的包名Mypackage, 然后创建YMD类,该类具有计算今年的年份,可以输出一个带有年月日的字符 串的功能。 (2)编写YMD.java文件,源代码如下。package M //声明存放类的包 import java.util.*; //引用java.util 包 public class JAVA_B_4_1YMD { private int year, month, public static void main(String[] arg3) { } public JAVA_B_4_1YMD(int y, int m, int d) { year = month = (((m &= 1) & (m &= 12)) ? m : 1); day = (((d &= 1) & (d &= 31)) ? d : 1); } public JAVA_B_4_1YMD() { this(0, 0, 0); } public static int thisyear() { return Calendar.getInstance().get(Calendar.YEAR);// 返回当年的年 份 } public int year() {// 返回年份46 } public String toString() { return year + &-& + month + &-& +// 返回转化为字符串的年-月日 } }(3)编译JAVA_B_4_1YMD.java 文件,然后将JAVA_B_4_1YMD.class 文 件存放到Mypackage 文件夹中。 3、编写使用包Mypackage 中JAVA_B_4_1YMD 类的程序 (1)JAVA_B_4_2.java 程序功能:给定某人姓名与出生日期,计算该人年 龄,并输出该人姓名,年龄,出生日期。程序使用了JAVA_B_4_1YMD 的方法 来计算年龄。 (2)编写JAVA_B_4_2.java 程序文件,源代码如下。import Mypackage.JAVA_B_4_1YMD; //引用Mypackage 包中的JAVA_B_4_1YMD 类 public class JAVA_B_4_2 { private S private JAVA_B_4_1YMD public static void main(String args[]) { JAVA_B_4_2 a = new JAVA_B_4_2(&张驰&, ); a.output(); } public JAVA_B_4_2(String n1, JAVA_B_4_1YMD d1) { name = n1; birth = d1; } public JAVA_B_4_2(String n1, int y, int m, int d) { this(n1, new JAVA_B_4_1YMD(y, m, d));// 初始化变量与对象 } public int age() // 计算年龄 { return JAVA_B_4_1YMD.thisyear() - birth.year(); // 返回当前年与出 生年的差即年龄 } public void output() {47 System.out.println(&姓名 : & + name); System.out.println(&出生日期: & + birth.toString()); System.out.println(&今年年龄 : & + age()); } }(3)编译并运行程序,记录并分析程序结构及其运行结果。三、使用接口技术1、接口的定义与作用 接口可以看作是没有实现的方法和常量的集合。接口与抽象类相似,接口中 的方法只是做了声明,而没有定义任何具体的操作方法。使用接口是为了解决 Java 语言中不支持多重继承的问题。单继承可使语言本身结构简单,层次清楚, 易于管理,安全可靠,避免冲突。但同时限制了语言的功能。为了在实际应用中 实现多重继承的功能,Java 使用了接口技术,一个类可以实现多个接口以达到 使用公用常量和一些常用的方法。 2、实现MouseListener 和MouseMotionListener两个接口 (1)编写实现接口的程序文件。四、了解异常处理机制1、错误与异常 在程序执行期间,会有许多意外的事件发生。例如,程序申请内存时没有申 请到、对象还未创建就被使用、死循环等,称为运行错误。根据错误的性质将运 行错误分为错误与异常两种类型。 (1)错误 程序进入了死循环或内存溢出,这类现象称为错误或致命性错误。错误只能 在编程阶段解决,运行时程序本身无法解决,只能依靠其它程序干预,否则会一 直处于一种不正常的状态。 (2)异常 运算时除数为0, 或操作数超出数据范围,打开一个文件时发现文件不存在, 网络连接中断等等,这类运行错误现象称为异常。对于异常情况,可在源程序中 加入异常处理代码,当程序出现异常时,由异常处理代码调整程序运行流程,使 程序仍可正常运行直到正常结束。 由于异常是可以检测和处理的,所以产生了相应的异常处理机制。而错误处 理一般由系统承担。 对于一个应用软件, 异常处理机制是不可缺少的。程序员必须在程序中考虑 每一个可能发生的异常情况并进行处理,以保证程序在任何情况下都能正常运 行。事实证明,一个仔细设计了异常处理的程序,可以长时间的可靠运行,而不 容易发生致命的错误,如程序被迫关闭、甚至系统终止等等。所以学会进行异常 情况处理对于想编写功能完善且具有实用价值的程序员来说是必不可少的。 2. 异常发生的原因48 (1)Java 虚拟机检测到了非正常的执行状态,这些状态可能是由以下几种 情况引起的: ? 表达式的计算违反了Java 语言的语义,例如整数被0 除。 ? 在载入或链接Java 程序时出错。 ? 超出了某些资源限制,例如使用了太多的内存。 (2)Java 程序代码中的throw 语句被执行。 (3)异步异常发生。异步异常的原因可能有: ? Thread 的stop 方法被调用。 ? Java 虚拟机内部错误发生。 3、异常处理机制 发生异常后,怎么处理异常呢?Java 提供了异常处理机制来处理异常。分 为两个步骤: (1)抛出异常 Java 是这样规定的:当语义限制被违反时,将会抛出(throw)异常,即产 生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻 找相应的代码来处理异常。一个异常对象可以由Java 虚拟机来产生,也可以由 运行的方法生成。异常对象中包含了异常事件类型、程序运行状态等必要信息。 (2)捕获异常 异常抛出后, 运行时系统从生成异常对象的代码开始,沿方法的调用栈进行 查找,直到找到包含相应处理的方法代码,并把异常对象交给该方法为止,这个 过程称为捕获(catch)异常。 简单说异常处理机制就是:当语义限制被违反时,将会抛出异常对象,并将 引起程序流程从异常发生点转移到程序员指定的处理异常方法代码处进行异常 处理。五、了解异常对象的类型在异常发生后,系统会产生一个异常事件,生成一个异常对象,有哪些异常 对象呢?这些异常对象来自哪些类呢? Java 中的异常类具有层次结构组织。其中,Throwable 类是Error 错误类和 Exception 异常类的父类,它是Object 的直接子类。RuntimeException 运行时异 常类是Exception 异常类的子类。如图所示。49 1、Exception异常类的子类 (1)RuntimeException运行时异常类,主要包括以下异常子类: ? ArithmeticException算术异常类:表示遇到了异常的算术问题,例如被0整 除。 ? ArrayStoreException数组下标越界异常类:试图把与数组类型不相符的值存 人数组。 ? ClassCastException类型强制转换异常类:试图把一个对象的引用强制转换 为不合适的类型。 ? IndexOutOfBoundsException下标越界异常类:下标越界。 ? NullPointerException空指针异常类:试图使用一个空的对象引用。 ? SecurityException违背安全原则异常类:检测到了违反安全的行为。 (2)NoSuchMethodException方法未找到异常 (3)java.awt.AWTException图形界面异常类 (4)java.io.IOException 输入输出异常类 ? IOException:申请I/O 操作没有正常完成。 ? EOFException:在输入操作正常结束前遇到了文件结束符。 ? FileNotFoundException:在文件系统中,没有找到由文件名字符串指定的文 件。 (5)Exception异常类的其它子类 ? EmptyStackException:试图访问一个空堆栈中的元素。 ? NoSuchFieldException:试图访问一个不存在的域。 ? NoSuchMethodException:试图访问不存在的方法。 ? ClassNotFoundException:具有指定名字的类或接口没有被发现。 ? CloneNotSupportedException:克隆一个没有实现Cloneable 接口的类。 ? IllegalAccessException:试图用给出了完整的路径信息的字符串加载一个 类,但是当前正在执行的方法无法访问指定类,因为该类不是public类型或在另 一个包中。 ? InstantiationException:试图使用Class 的newInstance方法创建一个对象实 例,但指定的对象没有被实例化,因为它是一个接口、抽象类或者一个数组。50 ? InterruptedException:当前的线程正在等待,而另一个线程使用了Thread的 interrupt方法中断了当前线程。 2、Error 错误类的子类 (1)VirtualMachineError虚拟机错误 ? OutOfMemoryError内存溢出错误 ? StackOverflowError栈溢出错误 (2) LinkageError链接错误 ? NoClassDefNotFoundError 类定义未找到错误 (3) java.awt.AWTError图形界面错误六、使用try…catch 语句处理异常1、异常类型匹配的处理方式 (1) 程序功能: 首先说明& 这是一个异常处理的例子&, 然后在程序中主动 产生一个ArithmeticException类型被0 除的异常, 并用catch语句捕获这个异常。 最后通过ArithmeticException类的对象e 的方法getMessage给出异常的具体类型 并显示出来。 (2)编写使用 try…catch 语句处理异常的程序文件JAVA_B_4_3.java,源 代码如下。public class JAVA_B_4_3 { public static void main(String[] arg3) { System.out.println(&这是一个异常处理的例子\n&); try { int i = 10; i /= 0; } catch (ArithmeticException e) { System.out.println(&异常是:& + e.getMessage()); } finally { System.out.println(&finally 语句被执行&); } } }(3)编译并运行程序,记录并分析程序结构及其运行结果。 注意:如果在catch语句中声明的异常类是Exception,catch语句也能正确地 捕获,这是因为Exception是ArithmeticException的父类。如果不能确定会发生哪 种情况的异常,那么最好指定catch的参数为Exception,即说明异常的类型为 Exception。 2、异常类型不匹配的程序 (1)编写一个catch语句中声明的异常类型不匹配的程序JAVA_B_4_4.java, 源代码如下。51 public class JAVA_B_4_4 { public static void main(String[] args) { System.out.println(“这是一个异常处理的例子\n”); try { int i=10; i /=0; } catch (IndexOutOfBoundsException e) { System.out.println(&异常是:&+e.getMessage()); } finally { System.out.println(&finally 语句被执行&); } } }(2)编译并运行程序,记录并分析程序结构及其运行结果。 因为JAVA_B_4_4 程序试图捕获一个异常类为IndexOutOfBoundsException 的异常,但发生的异常却是ArithmeticException类,所以,程序可以通过编译但 在运行时,系统会给出异常报告:报告所发生的但没有被捕获的异常。不过在此 之前,其它语句和finally语句将会被执行。 3、包含多个catch子句的异常处理程序 (1)程序功能:在try 子句中设计两个可能出现的异常,当a 为0 时会发生 异常。另外一个是肯定的异常,因为数组c的长度为1,定义c[42]是为法的。通过 两个catch 子句分别来捕获异常。 (2)编写包含多个catch子句的JAVA_B_4_5.java 程序,源代码如下。public class JAVA_B_4_5 { public static void main(String[] args) { try { int a = args. System.out.println(&\na = & + a); int b = 42 / int c[] = { 1 }; c[42] = 99; } catch (ArithmeticException e) { System.out.println(&发生了被 0 除:& + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(&数组下标越界:& + e); } } }52 (3)实验下面两种情况: 1)在程序运行时不输入参数,则args.length 的值为0,这将引起一个被0 除 异常。 2)在运行程序时,输入22,将不会引起被0除异常,但会引起一另一个异常 即数组下标越界ArrayIndexOutOfBoundsException。因为整型数组只有一个元素 c[0],程序中却要使用c[42],这将发生数组下标越界。七、使用throw 语句抛出异常1、throw 语句的作用 在上面的实验中,可以发现,异常对象是Java 运行时由系统抛出的。抛出 异常也可以通过使用throw语句实现。throw是Java语言的关键字,用来告知编译 器此处要发生一个异常。throw后面要跟一个新创建的异常类对象,用于指出异 常的名称和类型。 throw语句格式为:&throw& &new& &异常对象名()&; 程序会在throw语句处立即终止,转向try…catch寻找异常处理方法,不再执 行throw后面的语句。 2、throw语句的使用 (1)编写带有throw语句的程序TC5.java,源代码如下。public class JAVA_B_4_6 { static void throwProcess() { try { throw new NullPointerException(&空指针异常&); } catch (NullPointerException e) { System.out.println(&\n 在 throwProcess 方法中捕获一个& + e.getMessage()); } } public static void main(String args[]) { try { throwProcess(); } catch (NullPointerException e) { System.out.println(&再次捕获:& + e); } } }(2)编译并运行程序,记录并分析程序结构及其运行结果。 (3)程序执行流程53 程序首先调用throwProcess方法,明确地抛出了一个NullPointerException异 常并将其命名为“空指针异常”。然后程序流程将转向throwProcess方法中的catch 子句,输出一条信息。throwProcess方法的catch子句又抛出了一个同样的异常e。 然后结束throwProcess方法的调用,执行main方法中的catch子句,再次捕获这个 异常。八、使用throws 子句1、throws 子句的作用 throws子句一般用来表明在使用该方法时可能抛出异常但不捕获的异常。异 常由系统来处理。 throws子句也可以指出抛出异常是RuntimeException或自定义异常类,即异 常的类型, 以便准备调用其它方法捕获它,这种情况一般需要两个方法来分别处 理抛出异常和处理异常。 2、只是在方法中抛出异常的程序 对于程序中无法处理的异常,可以使用throws子句在方法中抛出异常交由系 统处理。 (1)程序功能:在程序中打开文件a3.txt,因为该文件可能不存在或路径不 对,所以存在IOException 类型异常的可能,因此这里使用throws 来抛出异常。 (2)编写只是抛出异常的程序文件JAVA_B_4_7.java,源代码如下。import java.io.*; public class JAVA_B_4_7 { public static void main(String args[]) throws IOException { FileInputStream fis = new FileInputStream(&a3.txt&); } }(3)编译并运行程序,如果该文件在当前目录中不存在,将由系统自动给 出异常报告。 3、带有捕获处理的throws 子句 (1)程序功能:在这个程序中的mathod 方法中使用throws 子句抛出异常, 在main 方法中捕获处理异常。 (2)JAVA_B_4_8.java,源代码如下。import java.io.*; public class JAVA_B_4_8 { static void mathod() throws IllegalAccessException { System.out.println(&\n 在 mathod 中抛出一个异常&); throw new IllegalAccessException(); }54 public static void main(String args[]) { try { mathod(); } catch (IllegalAccessException e) { System.out.println(&在 main 中捕获异常:& + e); } } }(3)编译并运行程序,记录并分析程序结构及其运行结果。九、使用finally 子句1、finally 子句的作用 当一个异常被抛出时, 程序的执行流程就不再是连续的了, 会跳过某些语句, 甚至会由于没有与之匹配的catch 子句而过早地返回,结束程序的运行。为了确 保一段代码不管发生什么异常都能被执行,可以使用finally 子句。每个try 语句 至少都要有一个与之相配的catch 或finally 子句。 从一个方法中返回到调用它的另外一个方法, 可以通过return 语句或通过一 个没有被捕获的异常,但finally 子句总是在返回前被执行。 2、创建使用finally 子句的程序文件JAVA_B_4_9.java。 (1)程序功能:在类JAVA_B_4_9 的mathodA 方法中使用try 子句捕获异 常,使用finally 子句处理异常。在类JAVA_B_4_8 的main 方法中使用try 子句 捕获mathodA 异常, (2)编写JAVA_B_4_9.java 程序,源代码如下。class JAVA_B_4_9 { static void mathodA() { try { System.out.println(&\nmathodA 抛出一个异常&); throw new RuntimeException(); } finally { System.out.println(&执行 mathodA 的 finally&); } } static void mathodB() { try { System.out.println(&mathodB 正常返回&); } finally { System.out.println(&执行 mathodB 的 finally&); }55 } public static void main(String args[]) { try { mathodA(); } catch (Exception e) { mathodB(); } } }(3)编译并运行程序,记录并分析程序结构及其运行结果。〖课后思考〗1、 包有什么作用?Java 系统有哪些类型的包?如何在程序中使用Java 系统 包中的类? 2、如何创建包含四个自己创建的类的自定义包,如何使用这四个类。 3、根据网上浏览的情况,说出Object 类的几个成员方法。 4、接口有什么作用?如何实现系统接口。 5、如何创建一个自定义接口?如何在一个类中实现这个接口? 6、什么是异常?异常处理机制有什么作用?异常处理有哪些方式。56 实验五 常用基础类库〖开发语言及实现平台或实验环境〗Windows XP、JDK 1.6与Eclipse 3.5〖实验目的〗1、了解Java 常用的系统类,包括Java Applet、字符串类、输入输出流类、 数学函数类、日期类、随机数类以及向量类等的基本使用方法。 2、理解Java 系统类的构成。〖实验要求〗1、进一步了解Applet 类。 2、掌握字符串类的使用方法。 3、掌握不同类型的输入输出流类,标准数据流、文件流、数据输入输出流、 对象流等。 4、掌握数学函数类的使用方法。 5、掌握日期类的使用方法。 6、掌握向量类的使用方法。〖实验内容〗 一、了解Applet 的生命周期程序运行从开始大结束的过程称为程序的生命周期。 独立应用程序的生命周 期从main()方法开始,直到运行结束。而Applet应用程序的生命周期与浏览器 相关。作为浏览器的一部分,Applet程序何时运行,何时结束都由浏览器控制, Applet 对象只是作为浏览器窗口中运行的一个线程。 浏览器与Applet具有如下关 系。 在浏览器中打开包含Applet对象的页面时, 创建并初始化其中的Applet对象。 显示Applet时,启动Applet线程运行。 不显示Applet时,停止 Applet线程运行。 在浏览器中关闭页面窗口时,销毁Applet对象。 与此相应,Applet类中声明了与生命周期相关的4个方法:init()、start()、 stop()、destroy()。4个方法代表Applet的4个活动阶段。 1、创建揭示Applet生命周期的程序JAVA_B_5_1.java。 (1)程序功能:本程序包含Applet 的4个与生命周期相关的方法init()、 start()、stop()、destroy()。程序中创建了自定义方法addWords()来显 示相应的字符串。addWords方法首先在标准输出即屏幕上显示字符串参数,然 后将字符串添加到字符串缓冲区buffer,通过调用repaint方法重画页面,首先自57 动调用updata方法将当前画面清空,然后再调用paint方法在指定位Z显示字符 串。 (2)编写JAVA_B_5_1.java程序文件,源代码如下。import java.applet.A import java.awt.G public class JAVA_B_5_1 extends Applet { StringBuffer buffer = new StringBuffer(); public void init() { addWords(&执行了初始化方法 init()...&); } public void start() { addWords(&执行了开始方法start()...&); } public void stop() { addWords(&执行了停止方法stop()...&); } public void destroy() { addWords(&执行了清除方法destroy()...&); } void addWords(String s) { System.out.println(s); buffer.append(s); repaint(); } public void paint(Graphics g) { g.drawString(buffer.toString(), 5, 15); } }2、编译JAVA_B_5_1.java 文件。 3、编写显示JAVA_B_5_1.class 的页面文件JAVA_B_5_1.html,代码如下。&html& &applet codebase=e:/java/程序 code=JAVA_B_5_1.class width=300 height=120& &/applet & &/html&4、在命令提示符窗口调用小程序查看器,浏览JAVA_B_5_1.html 页面观察58 Applet 应用程序,记录并分析程序结构及其运行结果。 5、程序分析:本程序不仅揭示了与生命周期相关的4 个方法,还揭示了 Applet 显示和刷新的3个方法:paint()、repaint()和updata()方法。Applet 的显示和刷新由一个独立线程控制,称为AWT 线程。AWT 线程的处理机制有 两种情况。 (1)自动执行paint方法重新绘图 如果程序中重写paint()方法,当浏览器运行时,AWT线程将自动在Applet 上绘制图形;或者Applet内容被覆盖,当其他窗口关闭或移开时,AWT线程会自 动调用paint方法,重画曾被覆盖的部分。 (2)调用repaint方法重新绘图 程序中如果需要重新绘图,可以调用repaint方法,AWT线程会自动调用 updata方法首先清空当前页面,然后调用paint方法重新绘制图形。二、使用字符串与字符串类java.lang 有两个字符串类String 和StringBuffer,封装了字符串的全部操作。 其中String 用来处理创建以后不再改变的字符串,StringBuffer 用来处理可变字 符串。 String 和StringBuffer 为最终类, 不能派生子类, 可以防止用户修改。 String 和StringBuffer 类在运行时要经历严格的边界条件检验,可以自动捕获异常,可 以提高程序的健壮性。 1.创建使用String 和StringBuffer 类的程序 (1)程序功能:实现字符串的翻转。 (2)编写JAVA_B_5_2.java 程序文件,源代码如下。import java.applet.A import java.awt.G public class JAVA_B_5_2 extends Applet { public void paint(Graphics g) { String str = &这是一个字符串――This is a test string&; g.drawString(&正常字符串:& + str, 30, 30); g.drawString(&翻转字符串:& + reverse(str), 30, 60); } public String reverse(String s) { int len = s.length(); StringBuffer buffer = new StringBuffer(len); for (int i = len - 1; i &= 0; i--) buffer.append(s.charAt(i)); return buffer.toString(); } }59 2、编译JAVA_B_5_2.java 程序文件。 3、 编写显示JAVA_B_5_2.class 的页面文件JAVA_B_5_2.html, 源代码如下。&html& &applet codebase=e:/java/程序 code=JAVA_B_5_2.class width=400 height=120& &/applet & &/html&4、在浏览器打开JAVA_B_5_2.html 文件,记录并分析程序结构及其运行结 果。 5、程序分析: 程序在paint 方法中首先定义一个String类对象str, 将&This is a test string& 将字符串常量赋给了str(实际的程序流程为Java系统先为字符串常量创建一个无 名字符串对象,然后再把字符串的引用赋给str)。然后使用Graphics的对象g, 调用drawString方法输出原始字符串,然后输出翻转后的字符串,对字符串的翻 转操作使用自定义的reverse方法实现。 在drawString方法里有一个字符串表达式, 将字符串常量和字符串变量进行了连接(+)运算,其结果仍为字符串对象,字 符串连接是String类的唯一运算操作。drawString (字符串对象,x 坐标,y 坐标) 方法将字符串按定义的位Z在Applet 中显示出来。 在reverse方法中,创建了StringBuffer对象buffer,在创建时指定其长度为字 符串参数s 的长度。程序中使用了String类的方法charAt(i)(可返回字符串的第i 个字符),使用了StringBuffer类的方法append连接字符串(可将参数值添加到字 符串尾部)。在for循环中,每次反向从字符串s中取出一个字符添加到buffer的尾 部。循环完毕,buffer中存放的就是翻转后的字符串。因为reverse方法的返回值 是String类型,因此还调用了toString方法将StringBuffer类型转换成String类型再 返回。三、使用输入输出流类1、使用标准数据流的应用程序 标准数据流指在字符方式下(如DOS 提示符)程序与系统进行输入输出的 方式,键盘和显示器屏幕是标准输入输出设备,数据输入的起点为键盘,数据输 出的终点是屏幕,输出的数据可以在屏幕上显示出来。 (1)程序功能:将键盘上输入的字符在屏幕上显示出来。 (2)编写JAVA_B_5_3.java程序文件,源代码如下。class JAVA_B_5_3 { public static void main(String[] args) throws java.io.IOException { byte buffer[] = new byte[10]; System.out.println(&从键盘输入不超过10 个字符,按回车键结束输入:&); int count = System.in.read(buffer);// 读取输入的字符并存放在缓冲区 buffer 中 System.out.println(&保存在缓冲区buffer 中元素的个数为:& + count); System.out.println(&buffer 中各元素的值为:&);60 for (int i = 0; i & i++) { System.out.print(& & + buffer[i]);// 在屏幕上显示buffer 元素的 值 } System.out.println(); System.out.println(&输出buffer 字符元素:&); System.out.write(buffer, 0, buffer.length); } }(3)编译JAVA_B_5_3.java文件。 (4)在命令提示符窗口运行JAVA_B_5_3.class文件,并输入1234,记录并 分析程序结构及其运行结果。 2、使用文件输入输出流的应用程序 (1)程序功能:将保存在本地机当前文件夹中的JAVA_B_5_1.HTML文本 文件的内容在屏幕上显示出来,然后将其另存为JAVA_B_5_1.txt文件。 (2)编写JAVA_B_5_4.java程序文件,源代码如下。import java.io.*; public class JAVA_B_5_4 { public static void main(String[] args) throws IOException { FileReader in = new FileReader(&JAVA_B_5_1.HTML&);// 建立文件输入 流 BufferedReader bin = new BufferedReader(in);// 建立缓冲输入流 FileWriter out = new FileWriter(& JAVA_B_5_1.txt&, true);// 建 立文件输出流 S while ((str = bin.readLine()) != null) { // 将缓冲区内容通过循环方式逐行赋值给字符串str System.out.println(str);// 在屏幕上显示字符串str out.write(str + &\n&);// 将字符串str 通过输出流写入 JAVA_B_5_1.txt 中 } in.close(); out.close(); } }(3)编译并运行程序,记录并分析程序结构及其运行结果。 (4)在当前文件夹中找到JAVA_B_5_1.txt文件并打开,再运行一次程序, 记录并分析程序结构及其运行结果。 3、使用随机文件类的应用程序61 使用文件输入类FileReader只能将文件内容全部读入。如果要选择读入文件 的内容,可使用随机文件类RandomAccessFile。 (1)程序功能:建立数据流,通过指针有选择的读入文件内容。 (2)编写JAVA_B_5_5.java 程序文件,源代码如下。import java.io.*; class JAVA_B_5_5 { public static void main(String args[]) { String str[] = { &First line\n&, &Second line\n&, &Last line\n& }; try { RandomAccessFile rf = new RandomAccessFile(&JAVA_B_5_5.txt&, &rw&); System.out.println(&\n 文件指针位置为:& + rf.getFilePointer()); System.out.println(&文件的长度为:& + rf.length()); rf.seek(rf.length()); System.out.println(&文件指针现在的位置为:& + rf.getFilePointer()); for (int i = 0; i & 3; i++) rf.writeChars(str[i]); // 字符串转为字节串添加到文}

我要回帖

更多关于 vb求闰年程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信