第一篇:Visual Basic程序设计教案公开课。
Visual Basic程序设计公开课教案
授课人: 冯 星
课题: 认识VB程序设计
对于每一位有志于掌握Windows平台上应用程序开发技术的学习者,都必须首先学习和掌握至少一门计算机程序设计语言作为应用程序的开发工具。VB是当今世界应用软件开发中最为流行的工具之一,要学习VB程序设计的语言和方法,就必须了解VB语言的基本特性、功能特点及其开发环境。【本章教学目标】
本章主要介绍VB语言的基本特性、功能特点及其开发环境。知识点:
1.Visual Basic 在程序开发中的地位及作用。2.掌握开发环境的窗口作用。
3.对Visual Basic的使用环境加以介绍。技能点:
1.理解并能解释面向对象程序设计的基本思想。2.熟悉并基本掌握Visual Basic的运行环境。
【教学要求】
了解:Visual Basic程序的基本特点。
了解:Visual Basic 6.0 的运行的软硬件环境和启动方法。理解:可视化程序语言与其他程序设计语言的区别。
【教学重点】
了解:visual Basic的基本知识特点。
了解:集成开发环境。
【教学方法】
1,启发式教学。2,多媒体辅助教学。3,任务驱动式。
【教学设计】新课讲授导入:
一,Visual Basic程序的基本特点。
1、具有面向对象的可视化设计工具
在VB中,应用面向对象的程序设计方法(OOP方法),把程序和数据封装起来视为一个对象,每个对象都是可视的。程序员在设计时只需根据界面设计的要求,直接在计算机屏幕上“画”出各种需要的不同类型的对象(控件和窗体),并为每个对象设置属性,就可以完成应用程序的人机对话的界面设计。最后程序员的编程工作仅针对对象要完成的功能进行编程,就可以完成应用程序的全部程序设计工作。
2、事件驱动的编程机制
事件驱动编程是当代最先进的编程方法,VB中每个对象都有相应的各种事件,每个事件都能够驱动一段程序的运行。针对对象所响应的事件进行编程,能够令应用程序完成设计者所期望的各种数据处理及其他工作。此种编程机制既可以极大地减少编程量,又可以降低编程的难度,使得程序易于编写和维护。
3、提供了易学易用的应用程序集成开发环境
VB为用户提供了开发应用程序的集成开发环境,用户可以在同一个开发环境中设计应用程序界面、编写程序代码、调试程序、进行应用程序的编译等各项工作。
4、结构化的程序设计
VB是在结构化的BASIC语言基础上发展起来的,并加入了面向对象的设计方法,因此VB是更出色的结构化程序设计语言.5,开放的数据库功能与网络支持.二, 集成开发环境窗口
系统集成开发环境也由一个窗口展示,它包括以下3个栏目:
1、标题栏
窗口中的“标题拦”用于标识当前工程的名称以及工程当前所处的工作模式。VB的工程有三种工作模式:
(1)设计模式:进行用户界面的设计、代码的编制及应用程序的开发。(2)运行模式:运行应用程序,此时不可编辑代码和界面。(3)中断模式:运行暂时中断,此时可编辑代码,但不能编辑界面。
2、菜单栏
“菜单拦”中包括13个下拉菜单,这些菜单中包含了程序开发过程中所需要的命令。(1)文件:主要用于创建VB的工程、保存工程、显示最近设计的工程、将当前工程编译生成可执行文件、保存或另存工程中的文件、打印等工作。VB的工程是应用程序的基本和主要载体,要开发一个VB的应用程序首先要创建一个工程。一个工程可以包含一个应用程序的全部窗体、模块、程序等。VB的工程以文件的形式存放到磁盘,文件的扩展名为:.VBP。
(2)编辑:主要用于对程序源代码的编辑,其中包括复制、粘贴、查找、替换等诸多功能。
(3)视图:主要用于在集成开发环境下,各种管理和工具窗口的显示,以便用户在程序设计中对VB源程序以及各种对象的查看和定义。(4)工程:主要用于添加窗体或模块、移除窗体或模块、在VB工具箱中添加控件、设置应用程序运行的启动窗体等。
(5)格式:主要用于设置窗体控件的位置(如水平居中、垂直居中)、多个控件的对齐位置、控件间的间距等。
(6)调试:主要用于源程序的查错和调试。(7)运行:用于程序的运行、停止及中断。
(8)查询:主要用于在设计数据库应用程序时设计SQL属性。(9)图表:主要用于在设计数据库应用程序时编辑数据库。
(10)工具:主要用于应用程序的菜单设计,以及应用程序设计过程中设置VB系统的各种编辑状态。如,是否要求对源程序进行自动语法检测、是否要求变量声明、是否要求控件对齐到窗体的网格等。
(11)外接程序:用于为工程增加或删除外接程序。
(12)窗口:用于屏幕窗口的层叠、平铺以及列出全部打开的文档窗口等。(13)帮助:用于帮助用户系统学习掌握VB的使用方法及程序设计的方法。
3、工具栏
工具拦可以使用户迅速地访问系统常用的菜单命令。
二、窗体窗口
窗体窗口用于对窗体的设计。窗体是组成VB应用程序的主体对象,它是一个容器,即每一个窗体都可以容纳诸多控件,它通常也是应用程序中人机交互的主要界面。一个应用程序中包括多个窗体,每个窗体必须有唯一的窗体名。在设计时,窗体网格是可见的,并可通过“工具”菜单中的“选项”命令来改变。
三、属性窗口
属性窗口由对象列表框、属性列表框、属性含义说明、属性显示排列方式4部分组成,通过属性窗口,用户可以设置对象的各种属性。
四、工程资源管理器窗口
工程资源管理器窗口类似Windows中的资源管理器,它保存并展示一个应用程序所有的文件,其中主要包括以下三类文件:窗体文件(文件扩展名是:.FRM)、标准模块文件(文件扩展名是:.BAS)、类模块文件(文件扩展名是:.CLS)。工程资源管理器窗口有三个按钮:“查看代码”、“查看对象”、“切换文件夹”,其中“查看代码”命令按钮用于查看与编辑窗体的源程序;“查看对象”命令按钮用于对窗体和窗体控件的设计以及各种对象属性的设置。
五、代码窗口
代码窗口专门供用户编写程序。打开代码窗口有以下三种方法:
1、选择窗体或模块后,单击“查看代码”按钮。
2、鼠标双击窗体或控件。
3、“视图”菜单中的“代码窗口”命令。
六、立即窗口
用户可在立即窗口显示所关心的表达式的值,以便调试程序。
七、窗体布局窗口
窗体布局窗口用于指定程序运行时的初始位置,主要为使用户所开发的应用程序能够在各种不同分辨率的计算机屏幕上正常运行。
八、对象浏览器窗口
对象浏览器窗口用以查看在工程中定义的模块或过程。
九、工具箱窗口
工具箱窗口为用户提供标准控件,如:命令按钮(Command)、标签(Label)、文本框(TextBox)、组合框(ComboBox)等,也可以通过“工程”菜单中的“部件”项在其中添加其它控件或Windows应用程序。
Vb中常用的基本概念
一、对象和类
1、对象(Object)
在OOP中,程序的核心是对象。在开发一个应用程序时,必须先建立各种对象,然后围绕对象来进行程序设计。对象是具有某些特性的具体事物的抽象(如:控件及窗体)。每个对象都具有描述其特征的属性,以及附属于它的行为。
在VB中,工程中的每一个窗体、窗体中的每一个控件都是一个对象。
2、类 类是创建对象实例的模板,是同种对象的集合与抽象,它包含所创建对象的属性描述和行为特征的定义。类含有属性和方法,它封装了用于类的全部信息。
在VB中,所见到的类大多是系统已经设计完成的,我们只需使用就可以了,如VB工具箱中的可视类图标是VB系统设计好的标准类控件。具体的如:工具箱中的“TextBox”控件就是一个标准类,当我们从该类中“取出”某个Text控件后,这个Text控件就成为一个对象,它自动继承了TextBox类的各种特征。即当我们在窗体上画一个控件时,就将类转换为一个对象,也就创建了一个控件对象,控件对象简称控件。VB也允许程序员自行设计类。
注意:窗体是一个特例,它既是对象又是类。
对象的属性、事件和方法
VB的控件具有自己的属性、事件和方法,我们可以将属性看作一个对象的性质,将事件看作对象的响应,将方法看作对象的动作,这三者构成了对象的三要素。
1、属性
对象中的数据保存在属性中,是用来描述和反映对象特征的参数。定义对象属性的方法有以下两种:
(1)在设计阶段使用属性窗口直接设置对象的属性。
如,给一个名为Label1的标签对象的“Caption”属性值定义为“建筑物资租赁管理”。(2)在程序代码编制过程中通过赋值语句来定义。其语句形式为:
<对象.属性>=<属性值> 如,在程序中用:Label1.Caption=“建筑物资租赁管理”的语句为Label1的标签对象的“Caption”属性赋值。
2、事件(1)事件
事件是发生在对象上的事情,VB系统为每一个对象预先定义了一系列的事件。如单击(Click)、双击(DblClick)、改变(Change)、获取焦点(GotFocus)等。
3、方法
面向对象的程序设计语言提供了一种特殊的过程和函数,该过程和函数称为方法。每个方法都可执行完成某项任务。
对象方法的调用格式为:
[对象.]方法 [参数名表] 例:Print方法。【任务实施】
一,创建工程 二,保存窗体 三,设计窗体 四,添加代码 五,运行程序
【创建第一个VB程序】 1,创建一个简单的窗口任务 2,在本基础上创建个文本框和第二个命令按钮。
课程总结 :
1,Visual Basic 6.0简介
简单介绍Visual Basic 6.0的发展历史和特点
2,Visual Basic 6.0的开发环境
Visual Basic 6.0启动与退出、Visual Basic 6.0的工作界面
3,Visual Basic 6.0工程管理
介绍VB工程的概念及管理工程的方法
4.创建第一个VB应用程序
结合一个VB应用程序实例介绍Vb应用程序开发步骤
【作业布置】:完成课本15页的操作题1,2。
第二篇:《VisualBasic程序设计》课程教学大纲
天津广播电视大学开放教育计算机网络技术专业、计算机信息管理(专科)
《VisualBasic程序设计》课程教学大纲
第一部分大纲说明
一、课程的性质与任务
VisualBasic程序设计课程是中央广播电视大学计算机相关专业的统设(统服)必修课,4学分,72学时,其中实验36学时,开设一学期。
课程的主要内容包括:可视化编程理论概述,VB可视化编程初步,应用程序接口设计及代码编写,VB高级语言技巧,文件处理应用程序设计方法,图形图像和多媒体应用程序设计方法,数据库应用程序设计方法,网络应用程序设计方法,调试与错误处理,Com和ActiveX应用。
通过本课程的学习,使学生掌握可视化程序设计方法和VB程序设计的编程技巧,具备用VB语言进行应用系统开发的初步能力。
二、与相关课程的关系
本课程是中央电大计算机相关专业的统设(统服)必修课。其先修课为计算机应用基础。
三、课程的教学要求
1.掌握VisualBasic语言的语法和VisualBasic程序的基本结构。
2.掌握程序设计方法。
3.掌握程序调试和错误处理的方法。
4.理解可视化编程和面向对象的概念。
5.了解ActiveX的简单应用。
四、课程的教学方法和教学形式建议
1.本课程的特点是:概念多、实践性强、涉及面广,因此建议采用在计算机教室(或计算机多媒体教室)进行讲授的教学形式,讲授、实验与课堂讨论相结合。
2.为加强和落实动手能力的培养,应保证上机机时不少于本教学大纲规定的实验学时。
3.应充分利用网络技术进行授课、答疑和讨论。
五、课程教学要求的层次
本课程的教学要求分为掌握、理解和了解三个层次。掌握是在理解的基础上加以灵活应用;理解是能正确表达有关概念和方法的含义,并且能够进行简单分析和判断;了解即能正确判别有关概念和方法。
在期末考核试卷中(涵盖实验内容),掌握的内容约占总分数的60%,理解的内容约占30%,了解的内容约占10%。
第二部分媒体使用与教学过程建议
一、课程学时分配
课程教学总学时数为72学时,4学分,其中实验课学时为36。各章学时分配如下:
章 教学内容
授课学时 实验学时 2 4 6 5 3 2 2 4 5 5 8 4 2 2 36 第一章 可视化编程理论概述 第二章 VB可视化编程初步
第三章 应用程序接口设计及代码编写 第四章 VB高级语言技巧
第五章 文件处理应用程序设计方法
第六章 图形图像和多媒体应用程序设计方法 4 第七章 数据库应用程序设计方法 第八章 网络应用程序设计方法 第九章 调试与错误处理 第十章 Com和ActiveX应用 合计 3 2 1 36
二、多种媒体教材的总体说明
本课程使用的教学媒体有:文字教材、录像教材、CAI课件和网上教学。
1.文字教材:主要教学媒体,是本课程教与学和考核的基本依据,对其他教学媒体起纽带作用,具有导学功能。文字教材采用分立式,包括主教材和实验教材。
2.录像教材:辅媒体,讲授课程的重点、难点以及在面授教学中难以实现的教学内容,是对文字教材的强化和补充。
3.CAI课件:自测练习,应用程序开发演练,通过交互式教学的特点,以解决学生在自学中遇到的疑难问题。
4.网上教学:教学辅导、答疑,阶段性总结和复习等。
三、教学环节
以文字教材为基础,通过录像教材、CAI课件等辅助教学媒体强化教学的重、难点内容,并通过实验课的训练,加深学生对课程内容的理解,掌握用VB语言进行程序开发的方法和技术。网上教学与教学进度同步,辅以办学试点单位教师的面授辅导,提高教学质量。
四、考核
本课程的考核采用期末终结性考核和形成性考核两种考核方式,期末终结性考核由中央电大根据教学大纲统一命题,占课程总成绩的80%,形成性考核以平时作业的形式完成,占课程总成绩的20%。
第三部分 教学内容和教学要求
第一章可视化编程理论概述(2学时)
一、教学内容:
1.“加法运算”应用程序实例分析
2.VB集成开发环境介绍
3.几种流行的可视化编程工具比较
4.面向对象的概念
二、教学要求:
1.掌握VB工程的概念及管理方法
2.掌握在VB集成环境中获得帮助的方法
3.理解可视化编程的概念和特点
4.了解目前流行的可视化语言的种类和主要特点
5.了解面向对象的概念及其基本机制
第二章VB可视化编程初步(4学时)
一、教学内容:
1.创建第一个应用程序:时钟程序
2.程序代码分析
3.窗体及基本控件
3.事件驱动
4.时钟程序分析
二、教学要求:
1.掌握VB应用程序开发的一般步骤。
2.掌握命令按钮、文本框和标签的使用和MsgBox函数的用法。
3.理解赋值语句和变量的概念。
4.理解对象、属性、方法和事件的概念及其之间的区别和联系。
5.理解事件驱动的原理。
6.了解时钟程序的工作原理
第三章应用程序接口设计及代码编写(6学时)
一、教学内容:
1.“简单的计算器”应用程序任务
2.可视化界面设计基础
3.可视化界面高级设计
4.代码设计基础
5.工程化思想及编程风格
二、教学要求:
1.掌握可视化界面设计的方法
2.掌握变量和常量的作用域、作用范围及用法
3.掌握运算符及流程控制语句的用法
4.理解工程化思想和编程风格
5.理解常用函数的使用方法
6.了解窗体设计的基本原则
7.了解“简单计算器”程序设计过程
第四章VB高级语言技巧(5学时)
一、教学内容:
1.“多功能计算器”应用程序任务
2.数组的使用
3.过程和函数的定义和调用
4.键盘使用技巧
5.鼠标使用技巧
二、教学要求:
1.掌握数组的使用方法
2.掌握键盘、鼠标的使用技巧
3.掌握过程和函数的定义和调用方法
4.掌握API函数的调用方法
5.了解枚举及自定义数据类型
6.了解“多功能计算器”程序设计过程
第五章文件处理应用程序设计方法(3学时)
一、教学内容:
1.“文件管理器”应用程序任务
2.文件系统控件及相关语句
3.标准文件输入/输出
二、教学要求:
1.掌握文件读写的基本方法
2.掌握与文件处理相关的语句和函数的用法
3.理解文件系统控件的基本功能
4.了解“文件管理器”应用程序的开发过程
第六章图形图像和多媒体应用程序设计方法(4学时)
一、教学内容:
1.“指针式时钟”和“VCD播放器”应用程序任务
2.VB坐标系统和颜色
3.相关控件介绍
4.绘图方法
5.图像处理的基本方法
6.播放多媒体信息的基本方法
二、教学要求:
1.掌握图形图像的基本处理方法。
2.理解VB坐标系统的原理。
3.理解“指针式时钟”程序的设计方法
4.理解“VCD播放器”程序设计的方法
5.了解播放多媒体信息的基本方法
第七章数据库应用程序设计方法(6学时)
一、教学内容:
1.“成绩查询”程序任务
2.VB数据对象及数据库访问机制概述
3.数据库控件和可视化数据管理器
4.报表设计
二、教学要求:
1.掌握VB数据库应用程序的基本框架
2.掌握SQL操纵数据的方法
3.理解使用VB数据库引擎操纵数据库的方法
4.理解VB数据对象及数据库访问机制
5.理解数据绑定控件的基本用法
6.了解使用Excel输出报表的方法
7.了解第三方报表控件的引用方法
8.了解DataReport、CrystalReport的使用方法
9.了解可视化数据管理器的使用方法
10.了解“成绩查询”程序的设计过程
第八章网络应用程序设计方法(3学时)
一、教学内容:
1.“网络聊天”程序任务
3.Winsocket控件及网络应用程序设计基础
2.其他网络应用程序设计
二、教学要求:
1.掌握Winsock控件的基本用法
2.了解网络应用程序设计的基础知识
3.了解“网络聊天”应用程序的开发过程
第九章调试与错误处理(2学时)
一、教学内容:
1.程序错误分类
2.程序调试方法
3.错误捕获及处理方法
二、教学要求:
1.掌握程序调试的基本方法
2.掌握错误捕获及处理的基本方法
3.了解程序错误的分类
第十章Com和ActiveX应用(1学时)
一、教学内容:
1.COM简介
2.ActiveX简介
3.COM对象的类型
4.ActiveX与COM的关系
二、教学要求:
1.了解ActiveXEXE组件开发应用方法;
2.了解ActiveXDLL组件开发应用方法;
3.了解ActiveX控件开发应用方法
第四部分 实验内容和实验要求
实验一:VisualBasic开发环境(2学时)
一、实验内容:
(1)VisualBasic6.0的安装、启动与退出
(2)定制VisualBasiv6.0的集成开发环境
(3)创建一个简单应用程序
二、实验要求:
1.了解VisualBasic(简称VB)对计算机系统的软、硬件要求。
2.练习VisualBasic6.0的安装,掌握启动与退出VisualBasic6.0的方法。
3.熟悉VisualBasic集成开发环境,掌握工具栏、属性窗口、工程资源管理器窗口、窗体布局窗口、代码编辑器窗口的使用。
实验二:简单程序设计(2学时)
一、实验内容:
(1)球表面积和球的体积的程序设计
(2)窗体的新建、属性设置
(3)身份验证程序设计
(4)创建“计时秒表”窗体程序
二、实验要求:
1.掌握建立和运行VisualBasic应用程序的基本步骤。
2.掌握文本框、标签、命令按纽的使用。
3.掌握MsgBox的使用和赋值语句的正确书写规则。
实验三:菜单设计(2学时)
一、实验内容:
(1)下拉式菜单设计
(2)弹出式菜单
(3)工具栏设计
二、实验要求:
1.掌握菜单编辑器的使用
2.掌握下拉式菜单和弹出式菜单的设计方法。
3.了解工具栏的设计方法。
实验四:鼠标、键盘、API函数调用(4学时)
一、实验内容:
(1)键盘错位程序
(2)实验键盘使用技巧
(3)鼠标事件应用
(4)窗体总在最前端实验
(5)百叶窗图形特效实验
二、实验要求:
1.掌握鼠标和键盘有关事件的使用方法
2.熟悉API函数的引用和调用方法
实验五:文件管理程序设计(5学时)
一、实验内容:
(1)Word文件查找显示程序
(2)文件读写程序
二、实验要求:
1.掌握文件管理程序相关控件的使用方法
2.掌握文件管理程序相关函数和过程的使用方法
3.掌握文件管理类程序开发的方法 实验六:绘图和多媒体应用(5学时)
一、实验内容:
(1)三角函数曲线的绘制
(2)常见几何图形绘制
(3)CD播放器程序设计
(4)API函数在多媒体中的应用
二、实验要求:
1.掌握建立图形坐标系的方法。
2.掌握VB的图形控件和图形方法以及常见几何图形的绘制。
3.掌握用多媒体控件制作简单多媒体播放器的方法。
4.了解API函数在多媒体中的应用。
实验七:数据库应用程序设计(8学时)
一、实验内容:
(1)数据绑定控件的使用方法
(2)VB数据库引擎访问数据库的方法
(3)SQL操纵数据库的方法
二、实验要求:
1.掌握利用SQL语句,通过ADO数据对象管理数据库的方法
2.理解数据库实用程序的框架体系
3.了解数据报表的制作方法 实验八:网络应用程序设计(4学时)
一、实验内容:
WinSocket控件的使用方法
二、实验要求:
1.掌握Winsock控件的使用方法
2.了解网络聊天程序的原理
实验九:简单程序调试及错误处理(2学时)
一、实验内容:
(1)程序调试实验
(2)错误捕获及处理实验
二、实验要求:
1.掌握断点的设置、监视、跟踪等程序调试方法
2.掌握OnErrorGoto、OnErrorResumeNext等语句的使用
3.理解Error对象的作用
实验十:ActiveX的简单应用(2学时)
一、实验内容:
1.ActiveXEXE组件编程
2.ActiveXDLL组件编程
二、实验要求:
1.了解ActiveXEXE组件的开发和使用方法
2.了解ActiveXDLL组件的开发和使用方法
第三篇:公开课 VB程序设计教案
第四课 学学程序设计—初步认识编程软件VB 教学目标:
知识目标:了解什么是程序设计语言和计算机程序以及语言的分类
过程与方法:培养学生的阅读总结和自主探索能力
情感态度与价值观:通过学生利用所学的知识解决实际问题,激
发学生的学习兴趣
教学重难点:了解什么是程序设计语言
启发学生创新思维
以任务为驱动,激发学生创新思维 教法:讲授法、任务驱动法 教学过程:
一、导入新课
教师运行游戏小程序,引起学生的兴趣,并打开程序的原代码说明编程并不很神秘。试运行游戏小程序,激发学生的学习兴趣。
二、教师讲授: 程序设计语言
教师活动:语言是人类交流思想、沟通感情最重要的工具。那么语言不通的人如何交流呢?
学生活动:请一个语言翻译或自己学会他人的语言
教师活动:计算机所做的事情均为人向机器下达的命令,那么操作作者又是通过什么语言同计算机进行沟通的呢? 程序设计语言的分类及特点
1、机器语言
教师活动:①计算机能听懂的语言(机器语言)②机器语言的实质(二进制语言)③二进制语言的特点。强调计算机内部只认识二进制
学生活动:谈对二进制语言的感受
教师小结:机器语言的特点(二进制、计算机直接能懂、难以理解,与人类语言差距较大)汇编语言-用助记符号表示面向机器的程序设计语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程雪汇编语言翻译成机器语言。适合编写直接控制机器操作的程序,不容易使用。高级语言-最接近人的自然语言,即简单易学,它所编制的程序计算机执行时需要“翻译”,执行速度比二进制程序慢。三:展示微课视频
VB简介、认识VB窗口、相关概念:
1、对象的概念
2、属性的概念
3、事件和代码的概念。演示设计运行程序“奔跑的小汽车”依照微课演示编写程序“奔跑的小汽车” 四:学生体验
1、学生编写程序“奔跑的小汽车”,教师巡回指导。
2、试修改程序,让汽车倒车、速度变慢。
五、教学评价:
1、教师点评教师通过巡视,把部分学生修改的结果进行点评,指出典型的错误。
六、课后小结:
这节课,我们体验了用VB设计程序,了解程序有关知识。(回顾本节知识)希望同学们继续努力。
第四篇:visualbasic程序设计教程-第四版-刘炳文编著-清华大学
Visual Basic 程序设计教程 部分习题参考
第四版刘炳文编著清华大学出版社 第五章
5.4、从键盘上输入4个数,编写程序,计算并输出这4个数的和及平均值。通过inputbox函数输入数据,在窗体上显示和及平均值。Dim a as single For i=1 to 4
a=inputbox(“请输入一个数:”,“数据输入”)
sum=sum+a
n=n+1
avg=sum/n next i print “和是:”,sum print “平均值是:”,avg 5.5、编写程序,要求用户输入下列信息:姓名、年龄、通信地址、邮政编码、电话,然后将输入的数据用适当的格式在窗体上显示出来。Dim a as variant Fontsize=20 a=inputbox(“请输入姓名:”,“数据输入”)print “姓名:”;a a=inputbox(“请输入年龄:”,“数据输入”)print “年龄:”;a a=inputbox(“请输入通信地址:”,“数据输入”)print “通信地址:”;a a=inputbox(“请输入邮政编码:”,“数据输入”)print “邮政编码:”;a a=inputbox(“请输入电话:”,“数据输入”)print “电话:”;a 5.7.设a=5,b=2.5,c=7.8,编程序计算:
y=(πab)/(a+bc)程序:
Dim a as single,b as single,c as single a=5 b=2.5 c=7.8 pi=3.14 y=(pi*a*b)/(a+b*c)print “结果是:”;y 5.8、输入以秒为单位表示的时间,编写程序,将其转换为几日几时几秒。Dim a as long,d as integer,h as integer,s as integer a=inputbox(“请输入秒数:”,“数据输入”)d=int(a/86400)h=int((a-d*86400)/3600)s=a-d*86400-h*3600 print d;“日”;h;“时”;s;“秒”
5.9、自由落体位移公式为:s=gt2/2+v0t 其中v0为初始速度,g为重力加速度,t为经历的时间,编写程序,求位移量s。设v0=4.8m/s,t=0.5s,g=9.81m/s2,在程序中把g定义为符号常量,用inputbox函数输入v0和t两个变量的值。
Dim v as single,t as single,s as single g=9.81 v= inputbox(“请输入初始速度:”,“数据输入”)v=val(v)t=inputbox(“请输入经历的时间:”,“数据输入”)t=val(t)s=g*t*t/2+v*t print “位移量是:”;s 第七章
7.1.编程计算并输出S的值:s=2+4+6+8+„+100 dim i,s as integer s=0 for i=2 to 100 step 2 s=s+i next print s 7.2、我国现有人口为13亿,设年增长率为1%,编写程序,计算多少年后增加到20亿。Private Sub Form_click()Dim p As Double Dim r As Single Dim n As Integer p = 130000000 r = 0.01 n = 0 Do While p <= 200000000 p = p *(1 + r)n = n + 1 Loop Print n;“年后”;“中国人口增加到”;p End Sub 7.3、给定三角形的3条边长,计算三角形的面积。编写程序:首先判断给出的3条边能否构成三角形,如可以构成,则计算并输出三角形的面积,否则要求重新输入。当输入-1时结束程序。
Dim a as single;b as single;c as single Start: a = inputbox(“请输入第一条边长-1结束:”,”数据输入”)a=val(a)if a=-1 then
end end if b=inputbox(“请输入第二条边长”,“数据输入”)b=val(b)c=inputbox(“请输入第三条边长”,“数据输入”)c=val(c)
if a+b<=c or a+c<=b or b+c<=a then
msgbox(“您输入的三条边长不能构成三角形,请重新输入!”)
goto start else
l=(a+b+c)/2
s=sqr(l*(l-a)*(l-b)*(l-c))end if print “三角形的面积为:”;s 7.5、编写程序,打印如下所示的“数字金字塔”
1 2 1
…… 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 Private Sub Form_Click()Dim a(1 To 5)As Integer For j = 1 To 5 a(j)= j Next j For i = 1 To 5 Print Tab(301 If j > i Then Print a(2 * i2
For J = I + 1 To Maxi)* 2);a(i, 3i
If w(j, 1)> w(j + 1, 1)Then
a1 = w(j, 0)
a2 = w(j, 1)
w(j, 0)= w(j + 1, 0)
w(j, 1)= w(j + 1, 1)
w(j + 1, 0)= a1
w(j + 1, 1)= a2
End If
Next j Next i For i = 0 To 9 Print w(i, 0)Next Print “名次” & “
运动员” & “
成绩” For i = 0 To 9
Print “ ” & i + 1 & “
” & Format(w(i, 0), “000”)& “
” & w(i, 1)Next End Sub Private Sub Form_Load()For i = 0 To 9
w(i, 0)= InputBox(“请输入第” & i + 1 & “运动员的编号”)
w(i, 1)= InputBox(“请输入第” & i + 1 & “运动员的成绩”)Next Command1.Caption = “名次排列” End Sub 8.10.VB编写程序,建立并输出一个10*10的矩阵,该矩阵两条对角线元素为1,其余元素均为0 Private Sub Form_Click()
Dim a(1 To 10, 1 To 10)As Integer
For i = 1 To 10
For j = 1 To 10
a(i, j)= 0
If i = j Then a(i, j)= 1
If i + j = 11 Then a(i, j)= 1
Print a(i, j);“ ”;
Next j
Next i End Sub 8.12.杨辉三角形每一行是(x+y)的n次方的展开式的各项系数。例如第一行系数是1;第二行1,1;第三行1,2,1„„请编写程序输出n=10的杨辉三角形 Option Base 1 Private Sub Command1_Click()Dim a()As Double m = InputBox(“请输入行数 ”, “输入”, 0)ReDim a(m, m)As Double For i = 1 To m a(i, 1)= 1 For j = 1 To m
a(j, j)= 1
If j >= 2 And j <= i1, j1, j)
End If Next j Next i For i = 1 To m For j = 1 To m
If i >= j Then Print Tab(j * 4);Str(a(i, j));
End If Next j Print Next i End Sub
第五篇:java程序设计教案
《Java程序设计》
授 课 人:授课班级:电子商务专业
授
课
教
案
第一章
Java语言简介
教学目的要求
了解Java的基本特点和用途 掌握如何下载Java SDK软件包 了解设置Java程序的开发环境SDK 如何运行Java程序 了解Java的概貌 主要内容
Java语言的发展历程; Java语言的特点; Java语言的开发工具;
Java应用程序和小程序; Java程序的注释方法; 写Java程序的风格规范。
重点内容
Java语言的特点; Java语言的开发工具;
Java应用程序和小程序;
难点内容
无
课时分配
1课时 教学方法
讲授法、演示法、对比法 讲授内容提要
1.1
Java语言的发展简介
1991年Sun Mircosystem 公司成立了一个Green项目开发小组,Jame Gosling 为组长; 设计Java 采用虚拟机代码(Virtual Machine Code),即.class文件,它通过解释器运行 ; 1995年5月Sun Mircosystem 公司对外正式发布Java1.0;
Java2 用途:适用于各种应用开发,尤其是网络应用,网络服务和嵌入式系统。1.2
Java语言的特点 1.简单性 2.面向对象 3.网络适用性 4.健壮性 5.安全性
6.平台无关性 7.可移植性 8.解释型 9.高性能 10.多线程 11.动态性 12.丰富的类库 13.嵌入浏览器运行
1.3
Java类库的概念 1.4
网络浏览器 1.5
Java开发工具
NetBeans: 这个集成环境可以方便地进行程序的编辑、编译、生成和运行。J2sdk :
http:// java.sun.com免费下载;Visual J++ 6.0 / 8.0: VJ++还吸收了VB集成开发环境IDE的特征,是一个强有力的Java程序开发工具。Jcreator
Eclipse(MyEclipse)等
1.6
Java程序的分类 基于控制台的应用程序;
基于浏览器运行的小程序applet。
小程序与应用程序的区别是:小程序必须依赖一个HTML文件和支持Java的网络浏览器。老师演示小程序和applet程序
应用程序举例(程序1-1): public class hello {
public static void main(String args[ ]){
System.out.println(“Hello Java!”);
} }
小程序举例(程序1-2):
import java.awt.Graphics;
// 注意该行的含义 import java.applet.Applet;public class sayhello extends Applet {
public void paint(Graphics g){
g.drawString(“Hello Java!”,35,30);
} }
小程序对应的HTML文件:
1.7
1.8 对Java程序的解释
编写Java程序的风格要求 课堂练习:
请编写一个应用程序输出你自己的学号和姓名 课外练习(作业): 下载并安装J2SDK; 设置系统环境变量 下载并安装MyEclipse 熟悉MyEclipse的开发环境
第2章
数据类型、运算符和表达式
教学目的要求
掌握字符常量和符号表示的常量的概念和应用 掌握整形、浮点型、字符型和布尔型变量的概念和应用 掌握数据的概念 理解参数传递方式
学会逻辑运算符、算术运算符和位运算符的使用方法
主要内容
常量:包括字面常量和符号表示的常量; 变量:整形、浮点型、字符型和布尔型; 数组:Java的数组属于类类型; 参数传递方式;
运算符:包括逻辑运算符、算术运算符和位运算符等;
重点内容
整形、浮点型、字符型和布尔型变量的概念和应用; 符常量和符号表示的常量的概念和应用
难点内容
参数传递方式
课时分配
2课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
2.1
常量
整形常量:采用八进制、十进制、十六进制表示,但不能采用二进制表示,和C/C++中的一样。
浮点常量:采用十进制或科学记数法表示。在缺省情况下一个浮点数是double型。布尔常量:true和false,它们不是数,不能进行算术运算。字符常量:与C/C++中的表示类似
。字符串常量:Java中字符串常量是对象。
2.2
变量
变量的命名原则是:以字母(’a’„’z’和 ’A’„’Z’)、下划线(‘_’)和‘$’符号开头的,由字母、数字(’0’„’9’)、下划线和‘$’构成的一个符号序列。
例如,a,_a,NameOfStudent,$10均是合法变量名,而-a和9a是非法变量名。关键字不能用作变量名(见表2-1)注意:Java对变量是区分大小写.2.2.1
整形类型的变量 字节(byte)型,8个位。
短整形(short),占16个位。整形(int),占32个位。
长整形(long int),占64个位。
Java中的整形最值均有符号。例如程序2-1测试最值:
public class Test_Int {
// 程序2-1 测试整形变量的最值
public static void main(String [ ] args){
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
} }
注意: byte、short、int、long是原子类型,而Byte、Short、Integer和Long分别是四种原子类型对应的类类型。
2.2.2
字符类型变量
Java字符量的长度为16个位,表示范围是从‘u0000’ 到 ‘uffff’ 即从0 到 65535; Character是char类型对应的类类型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3
浮点类型变量 分类:float和double。
Float、Double 是对应的类类型 ;
Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和
Float.NEGATIVE_INFINITY是正/负无限大。2.2.4
布尔类型变量
boolean变量取值:true和false ;
true和false不能转换成任何数值表示,true不是1,false也不是0。
2.2.5
原子类型变量的生存空间
一个变量的生存空间是由两个大括号决定的 范围。下列写法在C/C++中是正确的,但在Java中是错误的(注意)。{
int x=1;{ int x=0;// 错误 } }
2.3
变量赋值问题
如果类中定义的原子类型变量,未给出初值,那么它们将有缺省值 :byte、short、int 和long变量的缺省值是0;char、float、double和boolean变量的缺省值分别是’u0’、0.0f、0.0d和false。
方法内定义的局部变量,应当对其赋值,否则无法通过编译。例如: // 程序2-4 class Test {
// 定义一个类
int Value;// 类中的变量未赋值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){
int x=100;
// 必须赋值,否则无法通过编译
Test obj=new Test();// 对象赋值
System.out.println(obj.Value +“
”+x);
} } 2.4
数组
Java数组是系统定义类Array 的子类; 数组的分类同C/C++:一维和多维。
2.4.1
一维数组
定义数组的格式 :int a[ ] ; 或
int[ ] a ;其值是null ;
在定义数组时不能指定大小。a仅是一个引用,代表一个数组名,但没有对应的空间。产生数组空间的方法有两种 :
在定义时直接赋值:int a[ ]={1,2,3};
通过new分配空间: int a[ ]=new int[10];public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b= a;
for(int i=0;i<3;i++)b[ i ]++;
for(int i=0;i<3;i++)System.out.println(a[i]);
} }
public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b = new int[6];
System.out.println(“b数组长度 = ” + b.length);
for(int i=0;i System.out.print(b[i]+“ ”); } } 注意:(1)获得数组元素的个数:数组名.length; (2)一个整形数组若仅仅采用new分配空间,而没有对其赋值,那么每个元素的值是0 注意:Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制 2.5 Java中的参数传递方式 Java的参数传递的形式有两种:基本类型按值传递,对象类型按引用传递; 通过return语句从方法中返回时,基本类型总是以值的方式返回,而对象总是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras { static test fun(test o,int y){ o.x=20; } } y=1; return o;public static void main(String [ ] args){ test obj1 , obj2;int Val = 3;obj1=new test();obj1.x=100; obj2=fun(obj1,Val); System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val); } 2.6 Java的运算符 主要包括: 算术运算符、关系运算符、逻辑运算符、位运算符和三元条件运算符。2.6.1 算术运算符 算术运算符:+、-、*、/、%、++和--,与C/C++基本相同。 %运算符不但可以对整形数据运算,而且可以对浮点型数据运算。例如:3.14 % 2.5的值约等于0.64 ; 隠式数据类型转换: 当整型与浮点型数据进行混合运算时,表达式中的数据类型会进行相应的自动转换,规则为:byte->short->int->long->float->double。 这种转换规则也适应于赋值语句,当赋值符左右两侧变量类型不一致时,只要转换过程中不丢失数据,便进行自动转换。 class number { int x;} public class relationalOperator{ public static void main(String args[ ]){ } number n1,n2; n1=new number(); n2=new number();n1.x=1; n2.x=1;if(n1.x==n2.x) System.out.println(“对象的数据成员x相等!”); if(n1==n2) System.out.println(“n1和n2是一个对象!”);else System.out.println(“n1和n2不是一个对象!”);} 2.6.2 关系运算符 关系运算符不能同其它类型的变量一同 参与运算,例如假设a,b,c是三个整形的变量,那么 a=b==c 是 正确 OR 错误? ; 关系运算符用于对象时,是判别两个引用是否代表同一个对象。而不是判断两个引用所指向的对象是否同属一个类。 2.6.3 逻辑运算符 逻辑运算符有&&、|| 和!,分别是与、或和非。运算结果是true或false; 逻辑运算有求值“短路”现象,例如程序2-11 : public class shortCut { static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1));return x < 1;} static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2));return x < 2; } public static void main(String [ ] args){ } if(testOne(6)&& testTwo(1))System.out.println(“表达式为真”);else System.out.println(“表达式为假”); } 2.6.4 位运算符 位运算符:&、|、^、~、<<、>>,分别称为位与、或、异或、左移、右移; Java引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。例如: int a=-2 , b; b=a>>>30;2.6.5 三元条件运算符 语法格式:(exp)?(exp1):(exp2); Java要求:(exp1)与(exp2)必须同类型。2.6.6 “+”运算符 Java对“+”进行了重载,可以将任何类型的对象(包含原子类型)转化为String类型。例如: int x=1;char ch='A';double d=9.8;System.out.println(“Result: ”+x+ch+9.8);课堂练习: 课外练习(作业): P32 3、4、6题。 第3章 控制语句 教学目的要求 了解Java程序的结构,学习使用各种语句结构来控制程序的流程,完成程序的功能任务。 主要内容 Java的分支语句; 循环控制语句; break和continue语句; 带标号的break和continue语句。 重点内容 Java的分支语句; 循环控制语句; break和continue语句; 难点内容 循环控制语句; break和continue语句; 课时分配 3课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 3.1 分支语句 if-else语句; switch-case语句。 3.1.1 if 语句 if语句的语法格式 同C/C++; 条件表达式必须是布尔类型,例如: 下面的写法在C/C++中是合法的,但在Java中却是非法的 : int i=10;if(i) ...程序3-1描述了用applet从文本框获取数据,然后将比较的结果显示出来。 // 程序 3-1 import java.awt.*;import java.applet.*; public class compareNumbers extends Applet{ Label lab1,lab2;TextField input1,input2; int num1,num2;public void init(){ lab1=new Label(“输入第1个整数”); input1=new TextField(10); lab2=new Label(“输入第2个整数”);input2=new TextField(10); add(lab1); add(input1);add(lab2);add(input2);} public boolean action(Event e , Object o){ } if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText()); num2=Integer.parseInt(input2.getText()); if(num1 switch 语句 switch语句的语法结构 同C/C++; switch后面的表达式类型必须是字符类型或整形 ; case后面的常量不能重复 ; 程序3-3采用小程序实现将学生的百分制成绩转换为优、良,中、及格和不通过五个等级: // 程序3-3 import java.awt.*;import java.applet.*; public class scoreConvert extends Applet{ Label prompt; TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“输入成绩”); } public void paint(Graphics g){ g.drawString(“各等级的人数:”,25,40);g.drawString(“优秀 : ”+Excellent,25,55);g.drawString(“良好 : ”+Good,25,70);g.drawString(“中等 : ”+Middle,25,85);g.drawString(“及格 : ”+Pass,25,100);g.drawString(“不通过: ”+Failure,25,115);input=new TextField(2);add(prompt);add(input);} public boolean action(Event e , Object o){ int score=Integer.parseInt(input.getText()); showStatus(“"); input.setText(”“); switch(score/10){ case 10: case 9: Excellent++; break;case 8: Good++; break;case 7: Middle++; break;case 6: Pass++; break;case 5: case 4: case 3: case 2: case 1: case 0: Failure++; break;default: showStatus(”输入有误,重新输入!“); } repaint(); return true;} } 程序3-3需要注意的地方 在action()方法中调用的repaint()方法,是一个系统方法,它具有自动调用paint()方法的能力,从而实现对网页的刷新。3.2 循环控制语句 Java中的循环控制语句有三种,分别是:while,do-while和for语句;循环体内的语句会反复执行,直到控制布尔表达式的值变为false为止。3.2.1 while语句 while语句格式: while(Boolean-Expression) StatementS 程序示例3-4 略 3.2.2 do-while语句 do-while语句的语法格式如下: do{ Statement }while(Boolean-Expression); 程序3-5 如下: // 产生一个大于0.9的随机数为止 public class GenerateDoubleNumbers { public static void main(String args[ ]){ } double d;do{ d=Math.random();System.out.println(d); }while(d<0.9);} 3.2.3 for语句 for语句语法格式如下: for(ForInitopt;Boolean-Expression;ForUpdateopt) Statement // 程序3-6输出一个*三角形 public class printGraphics extends Applet{ public void paint(Graphics g){ int xpos,ypos=0; for(int row=6;row>=1;row--){ xpos=25;ypos+=15; } for(int column=1;column<=row;column++){ } g.drawString(”*“,xpos,ypos);xpos+=7; } } 3.3 break语句和continue语句 3.3.1 不带标号的break语句和continue语句 break语句可以跳出包含它的最内层的循环,不再执行剩余的语句; continue语句停止执行当前的循环,回到循环处,开始执行下一轮的循环。这些特性和C/C++的功能一样。for(int i=1;i<10;i++) { if(i%3==0) continue; else System.out.println(”i = “+i); } for(int i=1;i<10;i++) { if(i%3==0) break; else System.out.println(”i = “+i); } 课堂练习: 1、仔细分析下面程序,写出程序的最终运行结果。public class s_switch { public static void main(String args[]) { int ch=8; int r=10; switch(ch-1){ case 7: r=r+3; case 8: r=r+5; case 9: r=r+6;break; default:; } System.out.println(”r=“+r); } } 2、随机产生26个英文字母a~z,直到大于u为止。用while和for语句实现。 课外练习(作业): P44 1—4 第4章 Java的类 教学目的要求 理解面向对象编程的基本概念 了解类的封装方法 如何创建类和对象 了解成员变量和成员方法的特性 学习使用OOP方式进行程序设计 深刻理解类的继承性和多态性 主要内容 类的定义和使用; 方法的定义和使用; 实例变量和局部变量; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承; 抽象方法和抽象类; 对象类型转换; 访问权限限制符:public、private、protected。 重点内容 类的定义和使用; 方法的定义和使用; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承; 抽象方法和抽象类; 对象类型转换; 难点内容 构造方法; 方法的覆盖和重载; 继承的概念和应用; 组合与继承; 抽象方法和抽象类 课时分配 8课时 教学方法 讲授法、演示法、对比法、实验验证法、学生讨论法 讲授内容提要 4.1 类与对象 在Java程序中,除原子类型的变量以外都是对象,连Java程序本身也不例外。 类是面向对象程序设计的基础,OO始终是围绕着对象的封装性、继承性和多态性展开讨论的。 4.1.1 类与对象的区别 类是一个抽象的概念,对象是一个具体的概念。 类是在一组对象的基础上,通过抽象和概括获得的一个概念。 对象是由数据和方法紧密结合的一个封装体,具有信息隐藏的能力。 对象可以通过方法(函数)与其它对象进行通信,但并不知道这些方法的实现细节。4.1.2 Java和C编程思想的区别 C是结构化的编程语言,以函数为编程单元,程序员把注意力集中在编写函数上。Java是面向对象的编程语言,以类为编程单元,程序员的精力集中在对类的设计上。 对象将实例变量(instance variable)和对数据的操作(即方法)约束在一起,类似一个独立的程序,易于扩充,易于维护,代码可复用。 4.1.3 如何定义类 类是对象的模板,它定义了对象的结构和操作数据的方法。public class Sayhello extends Applet { public void paint(Graphics g){ int xPos=35; int yPos=30; g.drawString(”Hello Java!“,xPos,yPos); } } 定义类的通用格式如下: class className extends superClassName{ type instance-vairbale1;return-type methodName1(parameter-list){ method-body;} } public class Hello { public static void main(String args[ ]){ System.out.println(”Hello Java!“); } } 系统类Object是整个类层次结构中的根。 如果我们要定义Object的子类,可以不指明extends Object,默认情况下一个类就是Object类的子类。 类内定义的变量称为实例变量,函数称为方法; Java将类的定义和类的实现放在一起,便于系统维护。例如: class point { // Object类的子类 int x , y; void init(int a, int b){ int i=0; x=a; y=b; } } 4.1.4 对象和引用 对象是客观存在的变量,对象的引用就是对象的名字,例如:Point p1;创建对象:p1=new Point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。例如: class Point { // 程序4-1 int x , y; void init(int a, int b){ x=a; y=b; } } public class TwoPoint{ public static void main(String [ ]args){ Point p1= new Point(), p2= new Point(); p1.x=10;p2.x=30;p1.y=20;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y); } } 4.2 方法 方法是一个功能模块,类似C中的函数; 方法和实例变量都必须定义在类内,方法是类的功能接口 ; 定义方法的原则:方法应当只执行单一的任务,并且方法名能有效地表达该任务; 方法的返回值类型、方法名和参数表共同称之为方法的特征。调用方法的格式:引用.方法名(参数表);例如: Point p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//仅对p1对象的x和y进行赋值 p2.init(30,40);//仅对p2对象的x和y进行赋值 对象是客观存在的变量,对象的引用就是对象的名字,例如:point p1;创建对象:p1=new point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。 4.3 实例变量和局部变量 class Loc { // 程序4-2 int x=1;// 实例变量 void printLocVar(){ int x=25;// 局部变量 } System.out.println(”n x is :“+x); ++x; System.out.println(” x is :“+x); void printInstanceVar(){ System.out.println(”n x is :“+x); x*=10; System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主类 public static void main(String args[ ]){ System.out.println(“ x is :”+x); obj.printLocVar(); obj.printInstanceVar(); System.out.println(“ x is :”+x); loc obj=new Loc(); int x=5; // 局部变量 x } } 4.3 实例变量和局部变量 Java中的变量分为两种:类内定义的实例变量,方法中定义的局部变量。 在同一个作用域内,不允许定义两个同名的局部变量。 局部变量可以掩盖实例变量。 实例变量属于对象,它描述了对象的属性,随着对象的存在而存在; 局部变量是随着方法的调用而存在,一旦方法调用结束,局部变量也就消亡了。4.4 构造方法 构造方法的功能是在创建对象时初始化对象的实例变量; 讨论:构造方法的特点: 无返回值,无void 方法名与类名相同 仅在创建对象时调用 class point { // 程序4-3 } public class createPoint { public static void main(String args[ ]){ point p= new point(10,20); System.out.println(p.x +“ ”+p.y);} int x, y;point(int a, int b){ } x=a;y=b; } 如果类中没有定义构造方法,编译器会自动创建一个缺省的、不带参数的构造方法。构造方法是在对象创建之后,new操作完成前被调用的。 4.5 方法重载 方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完全相同;例如: class point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;} point(double a, int b){ x=(double)a;y=b;} } 方法重载的一个误区:是靠返回值区别重载,即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的; 4.6 关键字this this指代对象,是对当前对象的一个引用。例如: class IntVector { // 程序4-6 int v[ ]; boolean equals(IntVector other){ if(this == other)return true; return false;} } class testIntVector { public static void main(String args[ ]){ IntVector t1=new IntVector(),t3=new IntVector(),t2=t1; System.out.println(t1.equals(t2)); System.out.println(t3.equals(t2)); } } Java中的级连调用,仍是指代当前对象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*; class time{ private int hour, min, sec; time(){ setHour(0);setMin(0); setSec(0);} time setHour(int h){ hour=((h>=0 && h<24)? h: 0);return this;} time setMin(int m){ min=((m>=0 && m<60)? m: 0); return this;} time setSec(int s){ sec=((s>=0 && s<60)? s: 0); return this;} String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{ private time t; public void init(){ } t=new time();} public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20); } g.drawString(“ time:”+t.tostring(),25,45);} 在构造方法内部使用this,它用于指代另外一个构造方法,但不能指代非构造方法。例如: class point { } 4.7 继承 继承是软件重用的一种形式,可以提高系统的性能; 继承语法: class className extends superClassName{ 各实例变量和方法的定义 } 例如: class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} point(){ this.x=0; this.y=0;} } class circle extends point{ int radius; circle(int r, int x, int y){ radius=r; this.x=x; this.y=y; } } Java不支持多继承,但支持多接口; 子类的对象也是其超类的对象,反之未必; 继承具有传递性: B继承于A,C又继承于B,则C也继承了A中的实例变量和方法。 关键字super 构造方法是一种特殊的方法,子类不能继承超类的构造方法,但子类构造方法可以通过super调用超类的构造方法。int x, y;point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;} 当创建子类对象时,首先执行超类构造方法,然后执行子类的构造方法。例如: class point{ // 程序4-8 int x, y; point(int x, int y){ } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; System.out.println(“子类构造函数被调用!”); this.x=x;this.y=y; System.out.println(“父类构造函数被调用!”); } } public class testInherence { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); } } 再次讨论构造方法 若父类没有定义构造方法,那么对父类数据的初始化将采用系统缺省的构造方法;例如: class point{ int x, y; } class circle extends point{ int radius; circle(int r, int x, int y){ this.x=x; this.y=y; radius=r; } } 若父类定义有缺省构造方法,那么子类可根据自己的需要设置自己的构造方法。例如: class point{ int x, y; point(){ this(0,0); } point(int x, int y){ this.x=x;this.y=y; } } class circle extends point{ // 注意子类的构造函数 int radius; circle(int r, int x, int y){ radius=r;} } 若父类定义的构造方法都是有参的,那么子类构造方法必须通过super调用父类构造方法,class point{ private int x, y; point(int x, int y){ this.x=x; this.y=y; } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; } } 4.8 方法的覆盖 方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。 4.8.1 覆盖与重载的区别 重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法的特征一定不完全相同。 覆盖特点:子类中的方法特征与父类定义的对应方法的特征完全一样。例如: // 程序4-9 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){super(x, y); radius=r; } double area(){ return Math.PI*radius*radius;} } public class testOverWrite { public static void main(String args[ ]){ } circle c1; c1=new circle(1,1,1); System.out.println(c1.area());} 4.8.2 方法的动态调用 Java的所有对象运行时都有一个类型标识(RTTI:Run-Time Type Identification),该标识记录了每个对象所属于的类。Java用此标识在运行时选择正确的方法。例如: // 程序4-11 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r;} double area(){ // 覆盖了父类的area方法 return Math.PI*radius*radius; } } public class dynamicalCall { public static void main(String args[ ]){ point p[ ]={new point(2,2), new circle(1,1,1)}; for(int i=0;i System.out.print(“类名: ”+ } p[i].getClass().getName());System.out.print(“父类:”+ p[i].getClass().getSuperclass());System.out.println(“ 面积: ”+ } p[i].area());} 子类对象调用方法时: (1)子类检查是否具有同名和同参数类型的方法,若有则调用该方法,否则继续执行。 (2)到父类中寻找同名和同参数类型的方法,若有则调用该方法。若找不到,将产生编译错误。 对象决定自己到底该调用哪个方法,取决于该对象在继承链中的位置。 4.9 多态性不适合继承链中的实例变量 引用.方法:根据多态性调用; 引用.实例变量:根据引用的类型调用。即:多态性仅仅适用于方法的调用,而不适合实例变量。例如: class Base{ // 程序4-12 int x=1;void print(){ System.out.println(“当前类为 ”+ } this.getClass().getName());System.out.println(“对象的x= ”+this.x); } class Derived extends Base{ } int x=2;void print(){ System.out.println(“当前类为 ”+ } this.getClass().getName());System.out.println(“对象的x= ”+this.x); public class confusions{ public static void main(String [ ] args){ Base obj=new Derived(); } } obj.print();System.out.println(“对象的x= ”+obj.x); 4.10 finalize Java的垃圾回收器具有自动回收垃圾的能力。 垃圾回收器是一个优先级比较低的线程,在系统空闲时运行。 在对象被回收之前,有时需要执行一些特殊的操作,例如保存文件、清除屏幕等,这时就要用Java的finalize方法。例如: class point{ // 程序4-13 int x, y; point(int a, int b){ } x=a;y=b;System.out.println(“point constructor:”+getString()); public void finalize(){ // 注意该方法 System.out.println(“point finalizer:”+getString()); } String getString(){ return “x=”+x+“ y=”+y; } } class circle extends point{ int radius; circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString()); } public void finalize(){ System.out.println(“circle finalizer:”+getString()); } String getString(){ return super.getString()+“ radius=”+radius; } } public class testFinalize { public static void main(String args[ ]){ point c1,c2;c1=new circle(1,1,1);c2=new circle(2,2,2);c1=null;c2=null;System.gc(); } } 4.11 static static修饰变量(与C中的不同); static修饰方法(与C中的不同); 4.11.1 static变量 static变量是指这样的成员变量:不管在程序运行中生成多少个该类的对象,它们都共享该变量。 即使没有创建对象,该变量仍然存在。因此,static变量又称为类变量。定义格式为:static type variableName; static变量和一般的实例变量不同,在构造方法中不能对它进行初始化。例如: class point{ // 程序4-14 static int count;int x, y;static{ // 静态初始化块 } } count=0;System.out.println(“static variable is initialized!”); point(int a, int b){ count++;x=a; y=b; System.out.println(“Call point constructor!”);} public class testStaticVariable { public static void main(String args[ ]){ point c1=new point(0,0); System.out.println(“There are ”+ } 4.11.2 static方法 (可举例说明Math类的PI和sqrt等,为什么要用静态变量。)static方法是类中的成员方法,它属于整个类,即使不创建任何对象,也可使用静态方法。调用静态方法格式:类名.方法名(参数); 在子类中不能覆盖父类中定义的静态方法。 静态方法中只能出现静态变量和其它静态方法。并且还不能使用this和super。例如: class point{ // 程序4-15 static int count; int x, y; static{ count=0;System.out.println(“static variable is initialized!”); // 定义静态变量 } point.count +“ points”); } point(int a, int b){ count++;x=a;y=b; System.out.println(“Call point constructor!”); } static int getCount(){ // 静态方法 return count; } } public class testStaticMethod { public static void main(String args[ ]){ } point c1=new point(0,0);point c2=new point(1,1); System.out.println(“There are ”+ point.getCount()+“ points”);} 4.12 关键字final 在实例变量、局部变量和方法的形参定义之前加上final,那么这个变量值只能被引用,而不能修改。 final修饰的局部变量和实例变量必须给出初值,因为它修饰的变量代表一个常量。例如: class Base{ // 程序4-16 final int x=1; // 形式1:修饰实例变量 } public class finalVariables{ public static void main(String [ ] args){ final int var=100;// 形式3:修饰局部变量 } Base obj=new Base(); obj.print(var);void print(final int y){ // 形式2:修饰参数 // y=0; // 错误 } System.out.println(x+y); } 在方法定义前加上final,该方法就不能被子类覆盖,成为终极方法 ; 包含终极方法的类仍然可以被子类继承,子类虽然不能覆盖父类中的终极方法,但可以重载该方法。例如: class Base{ final int x=1; } class Derived extends Base { void print(){ // 重载了父类中的print方法 } System.out.println(x);final void print(int y){ } // 父类中的final方法 System.out.println(x+y);} 4.12.3 final类 在一个类定义前加上final,意味着这个类就不能被其它类继承,成为终极类。 系统类基本上都是final类,如String类。 将class定义为final是为了杜绝继承,类中的方法自然都变成了终极方法。例如: final class Base{ // 声明为final类 final int x=1; void print(final int y){ System.out.println(x+y); } } // 错误:不能继承final 修饰的Base类 class Derived extends Base { } 4.13 组合与继承 面向对象中的软件重用表现为两种形式:继承和对象组合。 设计这类程序的关键是构造方法:子类构造方法调用父类构造、成员对象的初始化。class date{ // 程序4-17 int year, mon,day; date(int y, int m, int d){ year=y; mon=(m>0 && m<13)?m:1;day=checkday(d); } int checkday(int d){ int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(d>0 && d<=daydisp[mon]) return d; if(mon==2 && d==29 &&(year%400==0 || year%4==0&& year%100!=0)) return d;return 1; } String tostring(){ return year+“/”+mon+“/”+day;} } class employee{ // 雇员类 long id;date birthday; 例如: employee(long no, int year, int mon, int day){ id=no; // 设置组合对象 } String tostring(){ return id+“ , ”+birthday.tostring();} birthday=new date(year,mon,day);} class manager extends employee { // 经理类 double basePay; String tostring(){ return basePay+“ , ”+super.tostring();} } public class compositionAndInherence { } public static void main(String [ ] args){ manager boss; } boss=new manager(1001,1971,11,5);System.out.println(boss.tostring()); manager(long no, int y, int m, int d){ super(no,y,m,d); // 调用父类构造函数 } basePay=1000; 4.14 抽象类和抽象方法 抽象方法:仅有方法特征,但没有代码; 抽象类:包含抽象方法的类。 抽象类的作用:提供一种适当的超类,子类通过继承实现父类中的抽象方法。 抽象类不能用final修饰。 抽象类体现了多态性,通过继承可以从抽象类派生出具有相似操作的子类。例如: abstract instrument abstract void play()继承 wind void play()继承 继承 stringed void play()percussion void play()继承 继承 woodwind void play()brass void play() // 程序4-18 abstract class instrument{ abstract void play();} // wind不是抽象类 class wind extends instrument{ void play(){ System.out.println(“wind play!”);} } // percussion也不是抽象类 class percussion extends instrument{ void play(){ System.out.println(“percussion play!”);} } // stringed也不是抽象类 class stringed extends instrument{ void play(){ System.out.println(“stringed play!”);} } class woodWind extends wind{ // 覆盖父类中的play方法 void play(){System.out.println(“woodWind play!”);} } class brass extends wind{ // 覆盖了父类中的play方法 void play(){ System.out.println(“brass play!”);} } public class music { static void tuneAll(instrument e[ ]){ } for(int i=0;i e[i].play(); // 抽象方法 public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5];int i=0; orchestra[i++]=new wind();orchestra[i++]=new percussion();orchestra[i++]=new stringed();orchestra[i++]=new woodWind();orchestra[i++]=new brass();tuneAll(orchestra); } } 程序运行结果: wind play!percussion play!stringed play!woodWind play!brass play! 4.15 对象的类型转换 4.15.1 向上类型转换 从子类向父类转换,在继承图中是向上移动,通常称为向上类型转换。 类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。 进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。例如: // 程序4-19 class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} int getX(){ return x;} } class circle extends point{ int radius;circle(int r, int x, int y){ super(x, y);radius=r;} double area(){ return Math.PI*radius*radius; } } public class testUpCasting { } public static void main(String [ ] args){ circle c=new circle(1,1,1);point p=c;// 注意:p和c的类型不同 } System.out.println(p.getX());4.15.2 向下类型转换 从父类向子类转换,在继承图中是向下移动,称为向下类型转换。 类型向下转换是不安全的,因为这是从一般类型到特殊类型的转换。例如: public static void main(String [ ] args){ } 4.16 访问权限限制 Java提供的访问权限修饰符有四个,即public、private、protected和友元; 修饰符要置于每个类成员(实例变量和成员方法)的定义之前,且仅能控制它所修饰的那个成员。 4.16.1 友员 缺省修饰符的情况就是友员。友员修饰符意味着同一个目录(包)中的所有类都可以访问这种类型的成员。 friendly不属于Java关键字,是C++的一个关键字。 例如: public class Base{ // 该类位于Base.java文件中 int friend_data=1;// 友员数据成员 } // 该类位于Derived.java文件中 public class Derived extends Base{ Base p=new Base(); // 访问Base类中的friend_data } 4.16.2 public 成员 不管两个类是否位于同一个目录中,一个类总可以访问另一个类的public成员。 public还可以用于修饰主类,文件名必须与主类名一致。除此之外,其它3个修饰符都不能用于修饰类,只能修饰成员。例如: public class Base{ public int friend_data=1;// public成员 } void dataUse(){ System.out.println(“data=”+p.friend_data); } point p=new point(1,1);circle c;c=p; //注意:此处编译时出错 c=(circle)p;//注意:此处运行时出错 System.out.println(c.area()); public class Derived extends Base{ public Base p=new Base(); public void dataUse(){ } 4.16.3 private成员 private成员的特性:除了其所在类能够访问该成员以外,其它类都不能访问它。 在多人合作开发一个系统的过程中,private可以让你自由使用自己定义的成员,无须担心与其他人写的类相冲突。例如: // 程序4-20 class Base{ private Base(){ } public class testPrivate { public static void main(String args[ ]){ // Base p=new Base(); // 编译有错 } } Base p = Base.makeBase();} // 注意 } System.out.println(“data=”+p.friend_data);} static Base makeBase(){ return new Base(); 4.16.4 protected成员 protected与继承有关,这种类型的成员可以被子类访问。 同一个包内的非子类,也可以访问这种类型的成员。即:protected天生就具有友元权限,例如: // 程序4-21 class Base{ // 该类位于Base.java文件中 int friend_data=1; // 友元成员 public int public_data=2; // public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } class Derived extends Base{ // Derived.java文件 Base a=new Base();void dataUse(){ } System.out.println(a.friend_data);System.out.println(a.public_data);// System.out.println(a.private_data);System.out.println(a.protected_data);} // 将主类存放在testData.java文件中 public class testData { public static void main(String args[ ]){ } Derived d=new Derived();d.dataUse(); } 访问权限总结 课堂练习: 1、定义一个Student类: 该类的功能有:可以保存、修改和获取学生的姓名、学号等。可以设置学生的英语成绩、数学成绩、Java成绩,并能计算平均分、最高分和最低分。 2、以下代码定义了一个类,请指出其中三条不合法的代码行(行号参见注释)。 class Test22{ //1 //7 } static float fac1(boolean f){ return f?u:v;} //8 float fac2(boolean f){ return f?u:v;} //9 float u; //2 static float v; //3 static void setUV(boolean f){ //4 u=fac1(f); //5 v=fac2(!f); //6 } 课外练习(作业): P87 1、3、4、6 第5章 接口和包 教学目的要求 掌握接口的定义和使用 了解接口与抽象类的异同点 掌握包的定义和使用 主要内容 接口的定义和使用 包的定义和使用 重点内容 接口的定义和使用 包的定义和使用 难点内容 无 1课时 课时分配 教学方法 讲授法、演示法 讲授内容提要 5.1 接口 引入接口的原因:在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。 5.1.1 接口的定义和应用 接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何实现这些方法。 Java允许一个类同时实现多个接口,相当于实现多继承的功能。声明一个接口的语法格式: [public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName(Parameter lists);} 例如: interface Sortable{ // 定义一个接口 int Compare(Sortable s);} 接口中不能声明任何变量和构造方法。 如果一个类实现多个接口,应该在接口名之间用逗号隔开。 当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。例如: // 程序5-1 interface Sortable{ // 定义一个接口 int Compare(Sortable s);} class Sort{ // 定义一个排序类,仅有一个静态的方法 public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable temp; for(i=0;i // 选择排序 k=i; for(j=i+1;j if(a[k].Compare(a[j])<0)k=j; temp=a[i];a[i]=a[k];a[k]=temp;} } } class Student implements Sortable{ // 定义一个学生类 private int score; Student(int x){score=x;} // 实现接口Sortable中的方法 public int Compare(Sortable s){ Student st=(Student)s; // 类型强制转换 return score-st.score;} public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形类也实现了接口 } public class interfaceTest { public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i;private int length,width; Rectangle(int x,int y){ length=x;width=y;} int area(){return length*width;} public int Compare(Sortable s){ // 实现接口 } public String toString(){ return “area=”+area();} Rectangle rec=(Rectangle)s; // 类型强制转换 return area()-rec.area(); for(i=0;i stud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud); // 排序 for(i=0;i System.out.println(stud[i].toString());Rectangle R[ ]=new Rectangle[10];for(i=0;i R[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R); // 排序 for(i=0;i System.out.println(R[i].toString()); } } 接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用这些常量。例如: // 程序5-2的部分 interface constant { int int int int EXCELLENT=5; GOOD=4; PASS=3; FAIL=2;} 在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致; 实现方法时必须在方法前加上public; 若一个类没有对接口中的方法具体实现,那么必须将该类声明为abstract类。例如: interface inter { // 接口 } void methodA(); abstract class Derived1 implements inter { // 此处不需要写出methodA()的原型 } class Derived2 extends Derived1{ public void methodA(){ // 实现方法 } } System.out.println(“Hi,methodA”);5.1.2 接口和抽象类的异同点 接口和抽象类的相同点: (1)都有空的方法,都必须在子类中实现这些方法。 (2)都不能用new关键字来创建这两种类型的对象。 (3)都可以具有继承关系。 (4)接口和类一样可以具有public属性。接口和抽象类的不同点: (1)在抽象类中,空的方法必须加abstract关键字,而在接口中不需要。 (2)在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法。 (3)接口允许多继承,类仅支持单继承。 5.2 包 在Java中可以将自己写的类,按一定的方法归属于不同的子目录中(包)。 在缺省情况下,Java将所有的类归属一个缺省包中。在不同的包中可以有同名的类存在。 Java中的包与C++中的名字空间相似。 5.2.1 package语句 package语句告诉编译器当前类属于哪个包。如果没有package语句,类就存放在无名的缺省包中(即当前目录中)。 引进包的概念主要是为了名字冲突。 格式: package pkgl[.pkg2[.pkg3]]; 5.2.2 import语句 import语句位于package语句之后,类的定义之前;格式:import package1[.package2].(class-name | *); 采用*号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。5.2.3 包应用举例 package Base; // 将该类存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成员 public int public_data=2;// public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } package Derived; // 将Base类存放在Derived包中 import Base.*; // 需要使用Base包中的类 public class Derived extends Base{ Base a=new Base(); // 为了让testData类能调用该方法,修改为public // 不能访问 public void dataUse(){ // System.out.println(a.friend_data); System.out.println(a.public_data); // System.out.println(a.private_data); // 不能访问 // System.out.println(a.protected_data);// 不能访问 } } // testData.java文件的内容如下: import Derived.*; //需要使用Derived包中的类 // 该类位于工作目录,不需要package语句 public class testData { public static void main(String args[ ]){ } } Derived d=new Derived(); d.dataUse(); 课堂练习: 课外练习(作业): P108 3~6 第6章 字符串处理 教学目的要求 掌握字符串的分类; 掌握内容不可改变的字符串类String; 掌握字符串常量; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 主要内容 字符串的分类; 内容不可改变的字符串类String; 字符串常量; 内容可以改变的字符串类StringBuffer; 字符串应用。 重点内容 掌握内容不可改变的字符串类String; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 难点内容 String和StringBuffer的区别和联系 课时分配 2课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 6.1 字符串的分类 java.lang包中定义了 String和StringBuffer两个类; 在运行中值不会改变的字符串,用String类存储;值会改变的字符串用StringBuffer类来存储。 两个类都有final修饰,这样可以优化字符串的操作。 6.2 String类 String类的定义原型 : public final class java.lang.String extends java.lang.Object { … } 6.2.1 字符串常量 字符串常量属于String类型;相同的字符串常量属于同一个对象,占用同一块空间,例如: // 程序6-1 public class TestConstString{ public static void main(String args[ ]){ } } String str1=“Hello”, str2=“Hello”; System.out.println(str1==str2);System.out.println(“Java”==“Java”);6.2.2 创建String类对象 用new运算符,并调用构造函数创建这种类型的对象,常见构造函数如下: 1.public String()采用该构造函数创建一个不含字符的空对象。例如: String str =new String(); 2.public String(char value[ ]) 将字符数组的内容转换为字符串,并赋予新建的对象。例如: char a[ ]={'J','a','v','a'};String str=new String(a);3.public String(char value[ ], int offset, int count) 例如:char a[ ]={'J','a','v','a'}; String str=new String(a,1,2); // 字符串str的内容是“av” 4.public String(String value) 采用value对象的值构造一个新的string对象。 例如: String str1=“Java”;String str2=new String(“Java”); System.out.println(str2); System.out.println(str1==str2); 5.public String(StringBuffer Buffer)注意采用字符串常量初始化一个String引用的问题。例如: String str = “abc”;相当于: char data[ ] = {'a', 'b', 'c'};String str = new String(data);应用举例,注意程序6-2的输出结果: public class TestString{ // 程序6-2 public static void main(String args[ ]){ String s1=“Java”, s2=“Java”;String s3=new String(s1); System.out.println(“ s1==s2 is ”+(s1==s2));System.out.println(“ s1==s3 is ”+(s1==s3));s1=“ABC”;s2=“DEFG”;System.out.println(“ s1==s2 is ”+(s1==s2));s1=s2; System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3 String类常用方法 1.public int length(): 求串长。例如: String str=“Java” ; System.out.println(str.length());2.public char charAt(int index) 提取指定位置上的字符。 3.public int compareTo(String anotherString) 对字符串内容按字典序进行大小比较。例如: public class SortStringArrary{ // 程序6-3 public static void main(String args[ ]){ String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”}; int i,j,k; System.out.print(“排序之前:”);for(i=0;i System.out.print(“t”+s[i]);for(i=0;i for(k=i,j=i+1;j if(s[k].compareTo(s[j])>0) k=j; str=s[i]; s[i]=s[k]; s[k]=str;// 注意该行的含义 } System.out.print(“n排序之后:”);for(i=0;i System.out.print(“t”+s[i]); } } 4.char[ ] toCharArray() 将String对象转换到一个字符数组中,例如: String s=“Hello,Java!”; char a[ ]; a=s.toCharArray(); for(int i=6;i System.out.print(a[i]);5.public boolean equals(String anString) 比较两个字符串对象的内容是否相等。 6.public boolean equalsIgnoreCase(String anotherString) 以忽略大小写方式,比较两个字符串对象的内容是否相等。 注意:equals()方法与“==” 之间的区别。例如: public class ConfuseQuestion{ // 程序6-5 public static void main(String args[ ]){ String s1=“java”; String s2=new String(s1); String s3=s2; } } System.out.println(s1.equals(s2));System.out.println(s2.equals(s3));System.out.println(s2==s3);System.out.println(s2.equals(s3));7.public int indexOf(int ch / String str) 在字符串中搜索字符或子串,返回字符或子串在String对象中从左边起首次出现的位置。如果没有出现,返回-1。 8.public String substring(int begin, int end) 提取string对象中从begin开始,到end-1结束的子串,返回提取的子串。 9.public String concat(String str)将str对象接到调用对象的后面,返回新串。例如: String s1=“Hello ” , s2=“Java” , s3;s3=s1.concat(s2); System.out.println(s3);注意:如果参数str为空(null),则concat方法不创建新串,而仅仅返回当前串,10.public String replace(char oldChar, char newChar) 将String对象中所有的oldChar字符替换为newChar,返回替换后的新串。例如: String path=“d:/myjava/documents”; System.out.println(path.replace('/' , '')); public String toString() 返回当前字符串对象本身。 12.public static String valueOf(各种类型 f) 将各种数据类型转换成一个相应的字符串表示,该方法是一个static方法。 程序6-6演示了valueOf()方法的应用。 程序6-7自学。 public class TestValueOf{ // 程序6-6 public static void main(String args[ ]){ char a[ ]={'A','B','C','D','E','F'}; int i=123456;float f=3.14159f;boolean b=true;Object o=null;System.out.println(String.valueOf(a));System.out.println(String.valueOf(a,2,3));System.out.println(String.valueOf(i));System.out.println(String.valueOf(f));System.out.println(String.valueOf(b)); System.out.println(String.valueOf(o));} } 6.2.4 Java应用程序的命令行参数 应用程序可以通过main方法的String数组,访问由解释器传递的命令行参数。例如: public class ShowMainArguments{ //程序6-8 public static void main(String args[ ]){ for(int i = 0;i < args.length;i++) System.out.println(args[ i ]); } } 6.3 StringBuffer类 StringBuffer类对象是一个内容可以改变的字符串。可以减少由于少量字符的插人而引起的空间分配问题。 StringBuffer类的原型: public final class java.lang.StringBuffer extends java.lang.Object { … } StringBuffer类对象有一块缓冲区,字符串被存放在缓冲区中,缓冲区的大小可以随程序的需要进行调整。缓冲区的大小称为对象的容量。 当修改对象的内容时,只要StringBuffer对象包含的字符个数没有超出容量,就不会分配新的空间,而直接在原空间内进行修改。若字符的个数超出了容量,该对象会自动调整其容量,从而适应新的存储。 6.3.1 创建StringBuffer类对象 StringBuffer类的构造函数有三种方式: 1.public StringBuffer()创建一个内容为空的StringBuffer对象,容量为16。 例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始内容为空,容量为length指定的大小。注意:length应大于等于0,不能为负数,否则会产生异常。例如: StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str) 初始内容和参数str的内容相同,容量为参数str的长度加上16。例如: String s1=“Java”; StringBuffer s2=new StringBuffer(s1);则s2的容量是20,内容是“Java”。 6.3.2 StringBuffer类常用方法 1.public int length() 返回字符串的长度 2.public int capacity() 返回缓冲区大小 3.public void setLength(int newLength) 指定对象的长度,将对象的内容进行裁减。如果参数小于对象的长度,则将对象截断;如果参数大于等于对象的长度,则填充空字符('u0')扩充新增加的部分。 4.public void ensureCapacity(int NewCapacity) 设定对象的缓冲区的大小,若参数 小于对象的容量,则新的设置将不起作用,也就是说容量只能扩大而不能缩小。 程序6-9演示了这几个方法的具体应用。 public class TestCapacity{ // 程序6-9 public static void main(String args[ ]){ String s=“Java”; StringBuffer str=new StringBuffer(s);System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8); // 设置长度为8 str.ensureCapacity(80);// 设置容量为80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); str.setLength(3); str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); } } 5.public void setCharAt(int index, char ch) 将参数index指定位置上的字符,设置成参数ch 指定的字符。例如: StringBuffer str=new StringBuffer(“Hello,Java”); str.setCharAt(3,'L'); 则str的内容变成了“HelLo,Java” 6.public StringBuffer append(多种数据类型) 将其它类型的数据添加到StringBuffer对象的尾部,返回修改后的StringBuffer对象。 例如:StringBuffer s1,s2=new StringBuffer(); s1=s2;// s1和s2代表同一个对象 s2.append(3.14).append(' ').append(“Java”); System.out.println(s1==s2); // 输出true System.out.println(s1); // 输出3.14 Java 7.public String toString() 该方法把StringBuffer对象的内容复制到一个新的String类对象中,返回这个新的String类对象。例如程序6-10。 public class BufferToString{ // 程序6-10 public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”);s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2); } } 8.public StringBuffer insert(int offset, 多种类型 b)该方法是将一个其它类型的对象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“); // 将字符串”Hello“插入到下标为0的位置 str.insert(0,”Hello“); System.out.println(”str= “+str);输出结果为: str= Hello Java! 6.4 略 应用举例 课堂练习: 无 课外练习(作业): P119 2、3、4 第7章 异常处理 教学目的要求 了解异常的层次结构; 掌握异常处理语句; 了解自定义异常; 了解异常处理中常用的调试方法。主要内容 异常的层次结构; 异常处理语句; 自定义异常; 异常处理中常用的调试方法。 重点内容 异常处理语句; 难点内容 无 课时分配 1课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 7.1 异常的层次结构 Throwable是异常类的根节点,定义在java.lang包,它的子类也定义在该包中; Error代表系统错误类,由系统直接处理; Exception类及其子类是在程序中可捕捉到的异常。见图7.1 Throwable Error achineError … AW TError LinkageError VirtualM RuntimeException ArithmeticException ArrayIndexO utO fBoundsException … Interrupted Exception AWTException IOException Exception FileNotFoundException… EOFException 1.java.lang.ArithmeticException 0作除数(包括模),将产生这类异常。例如:int x=0 , y; y=100/x; 2.java.lang.ArrayIndexOutOfBoundsException 例如:int a[ ]=new int[10]; a[10]=0; 3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10]; boolean b[ ]=new boolean[10]; System.arraycopy(a,0,b,3,6);//有异常 4.java.lang.ClassCastException 例如: Object obj=new Object(); int a[ ]=(int[ ])(obj); 5.java.lang.IndexOutOfBoundsException 例如:char ch=”ABC“.charAt(99); 注意: 2 是5的子类。 6.java.lang.NegativeArraySizeException 例如: int a[ ]=new int[-10]; 7.java.lang.NullPointerException 例如:int a[ ]=null; System.out.print(a.length);7.2 异常处理语句 缺省的异常处理的情况,例如: public class DefaultException{ // 程序7-1 public static void main(String args[ ]){ int a,b=0; a=2/b; // 此处有异常 System.out.println(“a=”+a);// 不运行此行 } } 异常处理语句有try、catch、finally、throw和throws。异常处理的形式为: try{ 程序执行体 }catch(异常类型1 异常对象1){ 异常处理程序体1 }catch(异常类型2 异常对象2){ 异常处理程序体2 }finally { 异常处理结束前的执行程序体 } 7.2.1 try和catch语句 try语句指明可能产生异常的代码段;catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。异常处理以后,程序从try语句代码段后继续执行。例如:程序7-2。public class TryCatchTest{ // 程序7-2 public static void main(String args[ ]){ int a=99,b=0,c; try{ System.out.println(”产生异常之前“);c=a/b; // 该行有异常 System.out.println(”产生异常之后“);}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理下标越界异常“);}catch(ArithmeticException e){ System.out.println(”处理算术异常“);} System.out.println(”异常处理结束“); } } 注意:用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理。例如: int a=99,b=0,c; try{ c=a/b;//产生的异常和捕捉的异常类型不一致 }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理异常“); } 注意:当有多个catch语句时,系统依照先后顺序逐个检查。例如: try{ c=a/b; }catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){ System.out.println(”Divided by zero“);} 7.2.2 finally语句 无论是否产生异常,finally语句指明的代码一定被执行。例如: public class testFinally{ // 程序7-3 public static void main(String args[ ]){ int a,b=0; for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{ switch(i){ } case 0: a=3/b; break;case 1: int c[ ]=new int[10]; c[10]=0; break;case 2: char ch=”ABC“.charAt(99); break;case 3: return;}catch(ArithmeticException e){ System.out.println(“零作除数!”); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”数组下标越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下标越界!“);}finally{ System.out.println(”在finally块中!“); } } 7.2.3 throw语句 throw语句用于指出当前行有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。 throw语句可以将异常对象提交给调用者,以进行再次处理。例如:程序7-4。public class ThrowException{ // 程序7-4 public static void Test(){ try{ int c[ ]=new int[10];c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 数组下标越界!“); } } throw e; // 异常抛出点 //System.out.println(“t产生异常后!”); 该行无法通过编译 } } public static void main(String args[ ]){ try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下标越界!“);}finally{ System.out.println(”t 在finally块中!“);} } } 7.2.4 throws语句 throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。例如: import java.io.*; // 程序7-6 public class testThrows { public static String readString()throws IOException{ int ch;String r=”“;boolean done=false; while(!done){ ch=System.in.read(); } if(ch<0 || ch==0xd) done=true;else r = r +(char)ch; return r; } public static void main(String args[ ]){ String str; try{ str=readString();}catch(IOException e){ System.out.println(”产生了输出/输出异常“); return;} System.out.println(”整数是:"+Integer.parseInt(str)); } } 建议:在多人合作写程序时,一个方法中产生的异常,最好在该方法中进行处理,不要将异常传播给其他人处理。 7.3 自定义异常类 通过继承Exception类或它的子类,实现自定义异常类; 对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。总体上分为两步: 第1步:定义异常类。例如: class userException extends Exception{ int n=0; // 计数器