Java大学实用教程.ppt_第1页
Java大学实用教程.ppt_第2页
Java大学实用教程.ppt_第3页
Java大学实用教程.ppt_第4页
Java大学实用教程.ppt_第5页
已阅读5页,还剩499页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章Java语言概述,本章导读1.Java语言的诞生2.学习Java的必要性3.java的特点4.java与C/C+之关系5.Java运行平台6.Java程序开发7.SDK1.6编译器的新规定,1.1Java语言的诞生,Java诞生于1995年,是Sun公司组织开发的一编程语言,主要贡献者是JamesGosling。1990年Sun公司成立了由JamesGosling领导的开发小组,开始致力于开发一种可移植的、跨平台的语言,该语言能生成正确运行于各种操作系统、各种CPU芯片上的代码。他们的钻研和努力促成了Java语言的诞生。Java的发展得利于Internet和Web的出现,Internet上有各种不同的计算机,它们可能使用完全不同的操作系统和CPU芯片,但仍希望运行相同的程序,Java的出现标志着真正的分布式系统的到来。,返回,1.2学习Java的必要性,Java不仅可以用来开发大型的桌面应用程序,而且特别适合于Internet的应用开发。目前,Java语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,而且很多新的技术领域都涉及到了Java语言,因此,学习和掌握Java已成为共识,国内外许多大学已将Java语言列入了本科教学计划,IT行业对Java人才的需求正在不断的增长,一些软件公司对其开发人员周期地进行Java的基础培训工作。在IT行业发达的北美洲,有将近60%的软件开发人员在使用Java完成他们的工作,EvansData公司在2002年做的一项调查中发现,在北美洲,Java的使用率已经接近C/C+。返回,1.3java的特点,1平台无关性Java语言和其他语言相比,最大的优势就是能够在所有的计算机上运行,这也是Java风靡全球的主要原因。2面向对象面向对象编程是一种先进的编程思想,更加容易解决复杂的问题。3多线程Java的特点之一就是内置对多线程的支持。多线程允许同时完成多个任务。4安全5动态,返回,1.4java与C/C+之关系,如果你学习过C+语言,你会感觉Java很眼熟,因为Java中许多基本语句的语法和C+一样,像常用的循环语句、控制语句等和C+几乎一样,但不要误解为Java是C+的增强版,Java和C+是两种完全不同的语言,他们各有各的优势,将会长期并存下去,Java语言和C+语言已成为软件开发者应当掌握的语言。,返回,1.5Java运行平台,1)三种平台简介目前Java运行平台主要分为下列3个版本:(JavaSE(曾称作J2SE)Java标准版或Java标准平台。JavaSE提供了标准的JDK开发平台,利用该平台可以开发Java桌面应用程序和低端的服务器应用程序,也可以开发JavaApplet。JavaEE(曾称作J2EE)Java企业版或Java企业平台,可以构建企业级的服务应用。JavaEE平台包含了JavaSE平台,并增加了附加类库,以便支持目录管理、交易管理和企业级消息处理等功能。JavaME(曾称作J2ME)Java微型版或Java小型平台。JavaME是一种很小的Java运行环境,用于嵌入式的消费产品中,如移动电话、掌上电脑或其他无线设备等。,2)安装JavaSE平台,学习Java必须从JavaSE开始,因此,本书基于JavaSE来学习Java。目前Sun公司已发布了JDK的1.6版本。如果安装JDK选择安装到E:Jdk1.6目录下,则会生成如图1.1的目录结构。,图1.1JDK目录结构,3)系统环境Path值的设置,JDK平台提供的Java编译器(javac.exe)和Java解释器(java.exe)位于Java安装目录的bin文件夹中,为了能在任何目录中使用编译器和解释器,应在系统特性中设置Path。对于Windows2000、Windows2003、WindowsXP,用鼠标右键点击“我的电脑”,弹出菜单,然后选择“属性”,弹出“系统属性”对话框,再单击该对话框中的“高级”选项,然后点击按钮“环境变量”,添加如下的系统环境变量(如图1.2所示):,图1.2设置环境变量path,4)系统环境ClassPath值的设置,编辑系统环境变量ClassPath的值。对于Windows2000、Windows2003、WindowsXP,用鼠标右键点击“我的电脑”,弹出菜单,然后选择属性,弹出“系统特性”对话框,再单击该对话框中的高级选项,然后点击按钮“环境变量”,添加如下的系统环境变量(如图1.3所示):如果曾经设置过环境变量:ClassPath,可点击该变量进行编辑操作,将需要的值加入即可。对于Win9x,用记事本编辑Autoexec.bat文件,将如下的设置语句加入即可,setclasspth=E:jdk1.6jrelibrt.jar;.;也可以在命令行窗口,如MS-DOS窗口键入命令:setclasspth=E:jdk1.6jrelibrt.jar;.;,图1.3设置环境变量classpath,5)仅仅安装JRE,如果你只想运行别人的Java程序可以只安装Java运行环境JRE,JRE由Java虚拟机、Java的核心类以及一些支持文件组成。可以登录Sun的网站免费下载Java的JRE。,返回,1.6Java程序开发,1.Java应用程序的开发开发一个Java应用程序的步骤:,编写源文件,编译源文件生成字节码,加载运行字节码,FileName.java,FileName.class,1)编写源文件(1)源文件的组成使用一个文字编辑器,如Edit或记事本,来编写源文件。不可使用Word编辑器,因它含有不可见字符。Java是面向对象编程,Java应用程序的源文件是由若干个书写形式互相独立的类组成。见例子1,(2)应用程序的主类,一个Java应用程序必须有一个类含有publicstaticvoidmain(Stringargs)方法,称这个类是应用程序的主类。args是main方法的一个参数,是一个字符串类型的数组(注意String的第一个字母是大写的),以后会学习怎样使用这个参数。,(3)源文件的命名规则,源文件有几个类?,源文件名=该类类名,有public类?,源文件名=类名之一,有几个public类?,源文件名=该Public类名,这是不允许的!,(4)良好的编程习惯,在编写程序时,一行最好只写一条语句,类体的以方法的大括号最好也独占一行,并有明显的缩进。本书在编写代码时,尽量遵守良好的编程习惯。良好的编程习惯对一个优秀的程序员是至关重要的!,2)编译Java源程序当创建了Hello.java这个源文件后,就要使用编译器(javac.exe)对其进行编译:需要打开MS-DOS命令行窗口,进入C盘,然后进入到1000目录中,如图1.4所示。,3)运行Java程序,Java应用程序必须通过Java虚拟机中的Java解释器(java.exe)来解释执行其字节码文件。Java应用程序总是从主类的main方法开始执行。因此,必须如下运行Java应用程序:C:1000javaHello运行效果如图1.5所示。当Java应用程序中有多个类时,java命令执行的类名必须是主类的名字(没有扩展名)。例:,(1)编译源文件c:1000javacTom.java如果编译成功,你的目录1000下就会有Tom.class和Example.class这两个字节码文件了。(2)执行c:1000javaExamplejava命令后的名字必须是主类的名字,运行效果如图1.6。,返回,2.JavaApplet程序的开发,开发一个JavaApplet程序需经过三个步骤:编写源文件、编译源文件生成字节码、通过浏览器加载运行字节码。(1)编写源文件一个JavaApplet源文件也是由若干个类组成的,一个JavaApplet源文件不再需要main方法,但必须有且只有一个类扩展了Applet类,即它是Applet类的子类(Applet类是系统提供的类),我们把这个类称作JavaApplet源文件的主类。下面的例子2是一个简单的JavaApplet源文件。,2)编译,c:1000javacBoy.java编译成功后,文件夹C:1000下会生成一个Boy.class文件。如果源文件有多个类,将生成多个class文件,都和源文件在同一文件夹里。如果你对源文件进行了修改,那么你必须重新编译,再生成新的字节码文件。,3)运行,JavaApplet由浏览器来运行,因此我们必须编写一个超文本文件(含有applet标记的web页)通知浏览器来运行这个JavaApplet。下面是一个最简单的一个html文件,通知浏览器运行JavaApplet。我们使用记事本编辑如下:现在可以使用浏览器打开文件Boy.html运行JavaApplet,效果如图1.7所示。,返回,如果你的浏览器不能运行你的Applet(如没有安装浏览器,或浏览器没有内嵌的java实时运行环境等),你也可以使用J2SE提供的appletviewer(小程序查看器)来运行你的Applet:C:tempappletviewerBoy.html,1.7JDK1.6编译器的新规定,和以前版本的编译器有了一个很大的不同,JDK1.6的编译器javac.exe不再向下兼容,也就是说,如果在编译源文件时没有特别约定的话,用JDK1.6的编译器生成的字节码只能在安装了JDK1.6或JRE1.6的Java平台环境中运行。可用“-source”参数约定字节码适合的Java平台。如javacsource1.2,返回,第2章基本数据类型和数组,本章导读1.标识符和关键字2.基本数据类型3.基本数据类型的转换4.数据的输入与输出5.数组,2.1标识符和关键字,1标识符用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。简单地说,标识符就是一个名字。Java语言规定标识符由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字。标识符中的字母是区分大小写的,Beijing和beijing是不同的标识符。2关键字关键字就是Java语言中已经被赋予特定意义的一些单词,它们在程序中有着不同的用途,不可以把关键字作为标识符来用。,Java语言中的关键字,在大多数的JAVAIDE中,关键字用蓝色字体显示.,返回,2.2基本数据类型,基本数据类型也称作简单数据类型。Java语言有8种简单数据类型,分别是:boolean、byte、short、int、long、float、double、char。这8种数据类型习惯上可分为4大类型:逻辑类型:boolean字符类型:char整数类型:byte、short、int、long浮点类型:float、double,2.2基本数据类型,1逻辑类型常量:true,false。变量的定义:使用关键字boolean来定义逻辑变量,定义时也可以赋给初值。如:booleanx,ok=true,关闭=false;2整数类型常量:123,6000(十进制),077(八进制),0 x3ABC(十六进制)。整型变量的定义分为4种,2.2基本数据类型,(1)int型使用关键字int来定义int型整型变量,定义时也可以赋给初值,例如:intx,平均=9898;对于int型变量,内存分配给4个字节(byte)。int型变量的取值范围是:-231231-1。(2)byte型使用关键字byte来定义byte型整型变量。对于byte型变量,内存分配给1个字节,占8位,byte型变量的取值范围是-2727-1。,2.2基本数据类型,(3)short型使用关键字short来定义short型整型变量。对于short型变量,内存分配给2个字节,short型变量的取值范围是-215215-1。(4)long型使用关键字long来定义long型整型变量,对于long型变量,内存分配给8个字节,long型变量的取值范围是-263263-1。,2.2基本数据类型,3字符类型常量:Unicode表中的字符就是一个字符常量,例如A,?,9,好,等。Java还使用转意字符常量,如:n:换行b:退格t:水平制表:单引号”:双引号变量的定义:使用关键字char来定义字符变量,例如:charx=A,漂亮=假,jiafei;,2.2基本数据类型,char型变量,内存分配给2个字节,占16位,最高位不是符号位,没有负数的char。char型变量的取值范围是065536。要观察一个字符在unicode表中的顺序位置,必须使用int类型显示转换,不可以使用short型转换,因为char的最高位不是符号位。同样,要得到一个065536之间的数所代表的Unicode表中相应位置上的字符也必须使用char型显示转换。下面的例子1中,分别用显示转换来显示一些字符在Unicode表中的位置,以及某些位置上的字符。,2.2基本数据类型,4浮点类型浮点型分两种(1)float型常量:453.5439f,21379.987F,2e40f(2乘10的40次方,科学计数法)变量的定义:使用关键字float来定义float型变量。对于float型变量,内存分配给4个字节,其取值范围是10-381038和-1038-10-38。,2.2基本数据类型,(2)double型常量:21389.5439d(d可以省略),23189908.987,123.0,6e-140(6乘10的-140次方,科学计数法)。变量的定义:使用关键字double来定义double型变量。double型变量,内存分配给8个字节,double型变量的取值范围大约是10-30810308和-10308-10-308。,返回,2.3基本数据类型的转换,基本数据类型的转换就是把一种基本数据类型变量转变成另一种基本类型变量。下列基本类型会涉及数据转换,不包括逻辑类型和字符类型。我们将这些类型按精度从“低”到“高”排列了顺序:byteshortintlongfloatdouble当把级别低的变量的值赋给级别高的变量时,系统自动完成数据类型的转换,如int型转换成long型。当把级别高的变量的值赋给级别低的变量时,必须使用显示类型转换运算。显示转换的格式:(类型名)要转换的值;,2.3基本数据类型的转换,例如intx=(int)34.89;输出x将是34,强制转换运算可能导致精度的损失。当把一个整数赋值给一个byte、short、int或long型变量时,不可以超出这些变量的取值范围,否则必须进行类型转换运算。下面我们看一个例子:程序运行结果见右图:,返回,2.4数据的输入与输出,由于C语言出现的比较早,那个时候还没有图形用户界面的概念(GraphicsUserInterface),因此,C语言提供了许多用来输入、输出数据的函数,例如printf、scanf等。Java不象C,提供在命令行进行数据输入、输出的功能不多。关于输入、输出我们将在第九章详细介绍,现在只需知道它的作用是在命令行窗口(例如,MS-DOS窗口)输出数据即可。Sun公司新推出的JDK1.5又新增了一些在命令行进行数据输入、输出的功能。,2.4数据的输入与输出,1数据输出:System.out.printfSystem.out.printf的功能完全类似C语言中的printf函数。pringf的一般格式:printf(格式控制部分,表达式1,表达式2,表达式n);例如:System.out.printf(“点的坐标为(%d,%d)”,x,y);输出:点的坐标为(200,300)Printf方法的用法与C语言相同。下面我们看一个例子,来进一步了解System.out.printf数据输出。,Printf()的格式控制部分,格式控制部分由格式控制符和普通字符组成。格式控制符用来输出表达式的值,普通字符原样输出。d输出整数类型数据。c输出字符类型数据。f输出浮点类型数据,最多保留6位小数。s输出字符串类型数据。输出数据时,也可以控制数据在命令行的位置:md输出的int类型数据占m列。m.nf输出的浮点数据占m列,保留n位小数。Java提倡用:n表示回车换行。,2.4数据的输入与输出,2数据的输入:ScannerScanner是SDK1.5新增的一个类,可以使用该类创建一个对象:Scannerreader=newScanner(System.in);然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型,nextByte(),nextDouble(),nextFloat(),nextInt(),nextLine(),nextLong(),nextShort()。,2.4数据的输入与输出,上述方法执行时都会堵塞,等待你在命令行输入数据回车确认。下面让我们来看一个例子,来更好的了解Scanner语句,在这个例子中,用户在键盘依次输入若干个数字,每输入一个数字都需要按回车键确认,最后在键盘输入一个非数字字符结束整个的输入操作过程。程序将计算出这些数的和及平均值。,返回,2.5数组,数组是相同类型的数据按顺序组成的一种复合数据类型。通过数组名加数组下标来使用数组中的数据。下标从0开始。1声明数组声明数组包括数组的名字、数组包含的元素的数据类型。声明一维数组有下列两种格式:数组元素类型数组名字;数组元素类型数组名字;,2.5数组,声明二维数组有下列两种格式:数组元素类型数组名字;数组元素类型数组名字;2创建数组声明数组仅仅是给出了数组名和元素的数据类型,要想使用数组还必须为它分配内存空间,即创建数组。在为数组分配内存空间时必须指明数组的长度。格式如下:数组名字=new数组元素的类型数组元素的个数;例如:boy=newfloat4;,2.5数组,0 x785BA,数组的内存模式,36.50,12.87,68.78,96.67,2.5数组,3数组元素的使用一维数组通过下标符访问自己的元素,如boy0,boy1等。需要注意的是下标从0开始,因此,数组若是7个元素,下标到6为止,如果你将来使用下标超过6将会发生异常(数组下标越界)。二维数组也通过下标符访问自己的元素,如a01,a12等。下标也是从0开始。,2.5数组,4数组的初始化创建数组后,系统会给每个数组元素一个默认的值,如,float型是0.0。我们在声明数组时同时也还可以给数组的元素一个初始值,如:floatboy=21.3f,23.89f,2.0f,23f,778.98f;,数组属于引用型变量,因此两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素。例如,对于inta=1,2,3,b=4,5;数组变量a和b分别存放着不同的引用。但是,如果使用了赋值语句:a=b;那么,a中存放的引用就和b的相同,这时系统将释放最初分配给数组a的元素,使得a的元素和b的元素相同,即a0,a1就是b0,b1,而最初分配给数组a的三个元素已不复存在.,2.5数组,下面让我们结合这个例子来看怎样使用数组。,2.5数组,返回,0 xB9671,0 xB8321,0 xB9671,Unicode标准字符集,Java语言使用;可识别65536个字符;前128个字符为ASCII码;包含了世界上几乎所有语言中的“字母”;,返回,第3章运算符、表达式与语句,本章导读1.算术运算符和算术表达式2.关系运算符与关系表达式3.逻辑运算符与逻辑表达式4.赋值运算符与赋值表达式5.移位运算符6.位运算符7.条件运算符8.instanceof运算符,9.一般表达式10.语句概述11.分支语句12.循环语句13.跳转语句,3.1算术运算符和算术表达式,(1)加减运算符加减运算的结合性是从左到右。加减运算的操作元是整型或浮点型数据,加减运算符的优先级是4级。(2)乘、除和求余运算符乘、除和求余运算的运算符号为*、/、%,都是双目运算符。*、/、%运算符的结合性是从左到右,例如:2*3/8,先计算2*3,然后再将得到的结果除以8。乘、除和求余运算的操作元是整型或浮点型数据。*、/、%运算符的优先级是3级。,(3)自增、自减运算符自增、自减运算的运算符号为:+、-,都是单目运算符,运算符的优先级是2级。运算符可以放在操作元之前,也可以放在操作元之后,但操作元必须是一个整型或浮点型变量(不能是常量或表达式)。运算符的作用是使变量的值增1或减1,如:+x,-x表示在使用x之前,先使x的值加(减)1。x+,x-表示在使用x之后,使x的值加(减)1。粗略地看,+x和x+的作用相当于x=x+1。但+x和x+的不同之处在于,+x是先执行x=x+1再使用x的值,而x+是先使用x的值再执行x=x+1。如果x的原值是5,则:对于y=+x;y的值为6。对于y=x+;y的值为5,然后x的值变为6。,(4)算术表达式用算术符号和操作元连接起来的符合Java语法规则的式子,称为算术表达式。如x+2*y-30+3*(y+5)-12+n+(-n)。(5)算术混合运算的精度精度从“低”到“高”排列的顺序是:byteshortintlongfloatdoubleJava将按运算符两边的操作元的最高精度保留结果的精度,例如:5/2的结果是2,要想得到2.5,必须写成5.0/2或5.0f/2。,char型数据和整型数据运算结果的精度是int。例如:bytek=18;那么H+k;的结果是int型,因此下列写法是不正确的,charch=H+k;应当写成:charch=(char)(H+k);,返回,3.2关系运算符与关系表达式,关系运算符用来比较两个值的关系,关系运算符的运算结果是boolean型数据,当运算符对应的关系成立时,运算结果是true,否则是false。(1)大小关系运算符大小关系运算的符号分别是:、=、1的结果是true。在书写时要特别注意的是“20-17的结果为true,因为算术运算符的级别高于关系运算符,1020-17相当于10(20-17)。,(2)等与不等关系等与不等关系运算的符号分别是:“=”、“!=”,都是双目运算符。运算符的级别是7级。“=”和“!=”都是由2个字符组成的一个完整的符号,书写时不要含有空格。注意不要将后面讲述的赋值运算符“=”与等号运算符“=”混淆。(3)关系表达式结果为数值型的变量或表达式可以通过关系运算符形成关系表达式。例如,2418,(x+y+z)30+x等。,返回,3.3逻辑运算符与逻辑表达式,逻辑运算用来实现boolean型数据的逻辑“与”、“或”和“非”运算,运算结果是boolean型数据。(1)逻辑“与”和逻辑“或”逻辑“与”和逻辑“或”运算的符号是:11111000在进行a1运算时,首先将11111000生级为int型,将高位用1填充:11111111111111111111111111111000然后在进行移位运算得到-16:11111111111111111111111111110000,因此,如果把a1的结果赋值给一个byte型变量就必须进行强制转换运算:byteb=(byte)(a1);在进行an运算时,如果a是byte、short或int型数据,系统总是先计算出n%32的结果m,然后进行am运算。例如,a33的计算结果与a1相同。对于long型数据,系统总是先计算出n%64的结果m,然后进行a,是双目运算符。假设a是一个被移位的整型数据,n是位移量。an运算的结果是通过将a的所有位都右移n位,每右移一个位,右边的低阶位被移出丢弃,并用0或1填充左边的高位,a是正数用0填充,负数时用1填充。因此,a每右移一次,如果该数的每一计算有效位都没有从低位移出时,就相当于将a除以2并舍弃了余数。正数不断右移位的最后结果一定是0,而负数不断右移位的最后结果是-1。对于byte或short型数据,an的运算结果是int型精度。,在进行an运算时,如果a是byte、short或int型数据,系统总是先计算出n%32的结果m,然后进行am运算,例如,a33的计算结果与a1相同。对于long型数据,系统总是先计算出n%64的结果m,然后进行am运算。在下面的例子1中,用户输入移位运算的两个操作元,程序给出右移和左移后的结果。,返回,3.6位运算符,(1)“按位与”运算符“(2)表达式语句一个表达式的最后加上一个分号就构成了一个语句,称作表达式语句。分号是语句不可缺少的部分。例如,赋值语句:x=23;,(3)复合语句可以用“”和“”把一些语句括起来构成复合语句,一个复合语句也称作一个代码块。例如,z=23+x;System.out.println(hello);(4)控制语句控制语句包括:条件分支语句、循环语句和跳转语句。(5)package语句和import语句package语句和import语句与类、对象有关,将在第4章讲解。,返回,3.11分支语句,1条件分支语句(1)if-else语句.if-else语句是Java中的一条语句,由一个“if”、“else”和两个复合语句按一定格式构成,if-else语句的格式如下:if(表达式)若干语句else若干语句一条if-else语句的作用是根据不同的条件产生不同的操作,执行法则如下:if后面()内的表达式的值必须是boolean型的。如果表达式的值为true,则执行紧跟着的复合语句;如果表达式的值为false,则执行else后面的复合语句。,(2)多条件if-elseif-else语句程序有时需要根据多条件来选择某一操作,这时就可以使用if-elseif-else语句。if-elseif-else语句是Java中的一条语句,由一个“if”、若干个“elseif”、一个“else”与若干个复合语句按一定规则构成。语句的格式如下:if(表达式1)若干语句elseif(表达式2)若干语句elseif(表达式n)若干语句else若干语句,有时为了编程的需要,复合语句中可以没有任何语句。一条if-elseif-else语句的作用是根据不同的条件产生不同的操作,执行法则如下:if以及elseif后面()内的表达式的值必须是boolean型的。该语句执行时,首先计算if后括号中的表达式的值,如果该表达式的值为true,则执行紧跟着的复合语句,然后就结束整个语句的执行;如果if后括号中的表达式的值为false,就依次再计算后面的elseif的表达式的值,直到出现某个表达式的值为true为止,然后执行该elseif后面的复合语句,结束整个语句的执行。如果所有的表达式的值都是false,就执行else后面复合语句,结束整个语句的执行。在下面的例子3中,用户在键盘输入3个数,程序判断这3个数能构成什么形状的三角形。,2switch开关语句switch语句是多分支的开关语句,它的一般格式定义如下:switch(表达式)case常量值1:若干个语句break;case常量值2:若干个语句break;case常量值n:若干个语句break;default:若干语句,switch语句中表达式的值必须是整型或字符型;常量值1到常量值n必须也是整型或字符型。switch语句首先计算表达式的值,如果表达式的值和某个case后面的常量值相同,就执行该case里的若干个语句,直到碰到break语句为止。若没有任何常量值与表达式的值相同,则执行default后面的若干个语句。其中default是可有可无的,如果它不存在,并且所有的常量值都和表达式的值不相同,那么switch语句就不会进行任何处理。需要注意的是,在同一个switch语句中,case后的常量值必须互不相同。下面的例子4使用了switch语句,用户在键盘输入一个代表月份的整数,程序输出是该月是在年度的第几季度。,返回,3.12循环语句,1while循环while语句的一般格式:while(表达式)若干语句while语句由关键字while、括号中的一个求值为boolean型数据的表达式和一个复合语句组成,其中的复合语句称作循环体,循环体只有一条语句时,大括号“”可以省略,但最好不要省略,以便增加程序的可读性。表达式称作循环条件。while语句的执行规则是:(1)计算表达式的值,如果该值是true时,就进行(2),否则进行(3)。(2)执行循环体,再进行(1)(3)结束while语句的执行while语句执行规则如流程图3.5所示。,while语句执行规则如流程图3.5所示。,图3.5while循环语句,2do-while循环一般格式:do若干语句while(表达式);do-while循环和while循环的区别是:do-while的循环体至少被执行一次,如图3.6所示。下面的例子5分别用while和do-while循环计算常数e的近似值:e=1+1/1+1/2!+1/3!+。,3for循环for语句的一般格式:for(表达式1;表达式2;表达式3)循环体for语句由关键字for、括号中用分号分割的3个表达式,以及一个复合语句组成,其中的“表达式2”必须是一个求值为boolean型数据的表达式,而复合语句称作循环体。,for语句的执行规则是:(1)计算“表达式1”,完成必要的初始化工作(2)判断“表达式2”的值,若“表达式2”的值为true,则进行(3),否则进行(4)。(3)执行循环体,然后计算“表达式3”,以便改变循环条件,进行(2)。(4)结束for语句的执行.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6=1+2+3。下面的例子6使用for循环计算出1000内的全部完数,返回,3.13跳转语句,跳转语句是指用关键字break或continue加上分号构成的语句,例如:break;在循环语句的循环体中使用跳转语句。在一个循环中,比如循环50次的循环语句中,如果在某次循环体的执行中执行了break语句,那么整个循环语句就结束。如果在某次循环体的执行中执行了continue语句,那么本次循环就结束,即不再执行本次循环中循环体中continue语句后面的语句,而转入进行下一次循环。下面的例子7和例子8使用的跳转语句。,返回,本章导读0.面向对象编程1.类声明和类体2.类体的构成3.构造方法与对象的创建4.对象的引用与实体5.成员变量6.方法,第4章类与对象,7.方法重载8.this关键字9.包10.import语句11.访问权限12.对象的组合13.基本类型数据的类包装14.反编译和文档生成器15.JAR文件,面向对象编程,封装封装是面向对象方法的核心思想之一。它有两个含义:一是指把对象的属性和行为看成为一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(即对象)中。另一层含义指“信息隐蔽”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓;或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。,继承子类可以继承父类的属性(数据)和功能(操作)。继承是面向对象方法中的重要概念,并且是提高软件开发效率的重要手段。多态多态程序中允许出现重名现象。Java语言中具有操作名称的多态如:RectrectangleOne;,2为声明的对象分配成员变量使用new运算符和类的构造方法为声明的对象分配成员变量,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的,你一定还记得构造方法的名字必须和类名相同这一规定),上述的Rect类提供了2个构造方法,下面都是合法的创建对象的语句:rectangleOne=newRect();或rectangleOne=newRect(10,20);,如果类里定义了一个或多个构造方法,那么Java不提供默认的构造方法。如果上述Rect只提供一个带参数的构造方法,代码:rectangleOne=newRect();创建对象是非法的。创建对象的代码:rectangleOne=newRect(10,20);会实现下述两件事:(1)为成员变量分配内存空间,然后执行构造方法中的语句。(2)给出一个信息,已确保这些成员变量是属于对象rectangleOne的。,创建对象就是指为它分配成员变量,并获得一个引用,以确保这些成员变量由它来“操作管理”。为对象分配成员变量后,内存模型由声明对象时的模型图4.1,变成如图4.2所示,箭头示意对象可以操作这些属于自己的成员变量。,图4.2分配实体后的对象,0 xAA11,RectangleOne,3创建多个不同的对象一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的内存空间,因此,改变其中一个对象的状态不会影响其它对象的状态。例如,我们使用前面的Rect类创建两个对象:rectangleOne、rectangleTwo。rectangleOne=newRect(10,20);rectangleTwo=newRect(33,66);当创建对象rectangleOne时,Rect类中的成员变量sizeA、sizeB被分配内存空间,并返回一个引用给ectangleOne;,当再创建一个对象rectangleTwo时,Rect类中的成员变量sizeA、sizeB再一次被分配内存空间,并返回一个引用给rectangleTwo。内存模型如图4.3所示。,rectangleOne,图4.3创建多个对象,0 xBB42,rectangleTwo,4使用对象对象不仅可以操作自己的变量改变状态,而且还拥有了使用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。通过使用运算符“.”,对象可以实现对自己的变量访问和方法的调用。1)对象操作自己的变量(对象的属性)2)对象调用类中的方法(对象的功能)下面例子1中,“Ladder”类创建了2个对象:ladderOne,ladderTwo。,返回,4.4对象的引用与实体,我们已经知道,当用类创建一个对象时,成员变量被分配内存空间,这些内存空间称做该对象的实体或变量,而对象中存放着引用,以确保这些变量由该对象操作使用。因此,如果两个对象有相同的引用,那么就具有同样的实体。假如使用例子1“Ladder”类的构造方法创建了两个对象t1,t2。t1=newLadder(11,22,33);t2=newLadder(6,12,18);,0 xAA,t1,0 xDD,t2,0 xDD,Java具有“垃圾收集”机制,Java的运行环境周期地检测某个实体是否已不再被任何对象所引用,如果发现这样的实体,就释放实体占有的内存。因此,Java编程人员不必象C+程序员那样,要时刻自己检查哪些对象应该释放内存。当把变量t2中存放的引用赋给t1后,最初分配给对象t1的成员变量(实体)所占有的内存就会被释放。没有实体的对象称作空对象。空对象不能使用,即不能让一个空对象去调用方法产生行为。假如程序中使用了空对象,程序在运行时会出现异常:NullPointerException。由于对象是动态地分配实体,所以Java的编译器对空对象不做检查。因此,在编写程序时要避免使用空对象。,返回,4.5成员变量,用关键字static修饰的成员变量称作静态变量或类变量,而没有使用static修饰的成员变量称作实例变量。例如,下述A类中,x是实例变量,而y是类变量。classAfloatx;/实例变量staticinty;/类变量类变量是与类相关联的数据变量,也就是说,类变量是和该类所创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其它对象的这个类变量。,因此,类变量不仅可以通过某个对象访问也可以直接通过类名访问。实例变量仅仅是和相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个对象的实例变量不会影响其它对象的这个实例变量。实例变量必须通过对象访问。下面例子2中,两个“Lader”对象共享bottom。效果如图4.7,2常量如果一个成员变量修饰为final,就是常量,常量的名字习惯用大写字母,例如:finalintMAX;声明常量时必须初始化。对于final修饰的成员变量,对象可以操作使用,但不能做更改操作。下面的例子给出了常量的用法。效果如图4.9,返回,4.6方法,我们已经知道,类体内容可以有2种类型的成员:成员变量和方法。其中一部分方法称作构造方法,供类创建对象时使用,用来给出类所创建的对象的初始状态。另一部分方法可分为实例方法和类方法,类所创建的对象可以调用这些方法形成一定的算法,体现对象具有某种功能。当对象调用方法时,方法中出现的成员变量就是指分配给该对象的成员变量。对象不可以调用构造方法,构造方法是专门用来创建对象的。方法的定义包括两部分:方法声明和方法体。一般格式为:,方法声明部分方法体的内容1方法声明和方法体最基本的方法声明包括方法名和方法的返回类型,返回类型也简称作方法的类型。如:floatarea().,方法的名字必须符合标识符规定。在给方法起名字时应遵守以下习惯:名字如果使用拉丁字母,首写字母使用小写。如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。例如floatgetTrangleArea()voidsetCircleRadius(doubleradius)等。方法声明之后的一对大括号“”、“”以及之间的内容称作方法的方法体。类中的方法必须要有方法体,如果方法的类型是void类型,方法体中也可以不书写任何语句。,2方法体的构成方法体的内容包括变量的定义和合法的Java语句,在方法体中声明的变量以及方法的参数称作局部变量,局部变量仅仅在该方法内有效。方法的参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效。写一个方法和C语言中写一个函数完全类似,只不过在这里称作方法。局部变量的名字必须符合标识符规定,遵守习惯:名字如果使用拉丁字母,首写字母使用小写。如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写。,3实例方法与类方法除构造方法外,其他的方法可分为实例方法或类方法。方法声明中用关键字static修饰的称作类方法或静态方法,不用static修饰的称作实例方法。一个类中的方法可以互相调用:实例方法可以调用该类中实例方法或类方法;类方法只能调用该类的类方法,不能调用实例方法;如:A类中的max方法和getMaxSqrt方法是类方法;sum和min方法是实例方法。,实例方法可以操作成员变量,无论是实例变量或类变量;而类方法只能操作类变量不能操作实例变量,也就是说类方法中不能有操作实例变量的语句。二者为何有着这样的区别呢?(1)实例方法必须通过对象来调用(2)类方法可以通过类名调用无论类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存。下面的例子4,通过类名调用类方法。,4参数传值当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递值的拷贝。方法如果改变参数的值,不会影响向参数“传值”的变量的值。(1)基本数据类型参数的传值下面的例子5中,向一个方法的基本型参数传值。效果如图4.11,(2)引用类型参数的传值Java的引用型数据包括我们以前学习过的对象、数组以及后面将要学习的接口。当参数是引用类型时,“传值”传递的是变量的引用而不是变量所引用的实体。,图4.10引用类型参数的传值,实体,传值,如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化,因为,两个引用型变量如果具有同样的引用,就会用同样的实体。但是,改变参数的引用不会影响向其传值的变量的引用。下面的例子6向一个方法的引用型参数传值。效果如图4.13,注意在上述例子6中,tom调用方法f把对象jerry的引用“传值”给参数a后,对象jerry和对象a就具有同样的成员变量,即同样实体。因此,jerry和a就具有同样的功能,也就是说a调用方法产生的行为和jerry调用同一方法产生的行为完全相同。当对象a执行a=null;后,a就不再有任何实体,变成一个空对象,如果再执行:a.setLeg(100);就会引起NullPointerExcetion异常。但是,jerry的引用没有发生任何变化,它依然引用着原来的实体,仍然可以调用方法产生行为。在下面的例子7中,“Cone”类在创建对象时,将一个“Circle”对象的引用“传值”给“Cone”对象的“bottom”。效果如图4.14,返回,4.8方法重载,方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。方法的返回类型和参数的名字不参与比较,也就是说,如果两个方法的名字相同,即使类型不同,也必须保证参数不同。下面例4-8Area类中getArea方法是一个重载方法。效果如图4.15,返回,4.9this关键字,this是Java的一个关键字,可以出现在实例方法和构造方法中,但不可以出现在类方法中。1在构造方法中使用thisthis关键字可以出现在类的构造方法中,代表使用该构造方法所创建的对象。下述例子9中的构造方法中出现了this,表示该对象在构造自己时调用了方法cry()。2在实例方法中使用thisthis关键字可以出现在类的实例方法中,代表使用该方法的当前对象。,我们已经知道,实例方法可以操作成员变量。实际上,当成员变量在实例方法中出现时,默认的格式是:this.成员变量;意思是当前对象的成员变量,如:classAintx;voidf()this.x=100;,在上述A类中的实例方法f中出现了this,this就代表使用f的当前对象。所以,this.x就表示当前对象的变量x,当对象调用方法f时,将100赋给该对象的变量x。因此,当一个对象调用方法时,方法中的成员变量就是指分配给该对象的成员变量。因此,通常情况下,可以省略成员变量名字前面的“this.”。我们知道类的实例方法可以调用类的其它方法,调用的默认格式是:this.方法;,如:在上述B类中的方法f中出现了this,this代表使用方法f的当前对象,所以,方法f的方法体中this.g()就是当前对象调用方法g,也就是说,当某个对象调用方法f过程中,又调用了方法g。由于这种逻辑关系非常明确,一个方法调用另一个方法时可以省略方法名字前面的“th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论