Java程序设计开发教程课件_第1页
Java程序设计开发教程课件_第2页
Java程序设计开发教程课件_第3页
Java程序设计开发教程课件_第4页
Java程序设计开发教程课件_第5页
已阅读5页,还剩579页未读 继续免费阅读

下载本文档

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

文档简介

第1章Java入门

1.1Java简介Java的崛起面向对象的程序设计语言Java平台和虚拟机两类Java程序Java程序开发环境——SDKJava的崛起1991年4月8日,从工作站起家的Sun公司为了把市场扩大到消费电子产品,成立了一个专门的工作小组,着手代号为“Green”的项目,目的是开发一个分布式代码系统,让人们可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,同它们进行信息交流应用的C++进行开发。但是C++太复杂,安全性也差,最后不得不定义一套新的语言系统,于是便有了Oak的问世Oak一方面汲取了C++中的有益成分,同时融进了网络应用特性,可以称上是一种的精巧而安全的语言了MarkArdreesen的Mosaic和Netscape的巨大成功给Oak项目组成员带来了新的希望,他们重整旗鼓,对Oak进行了一次新的整合,并取名为Java,后用Java编制了HotJava浏览器,吹响了进军Internet的号角Java所特有的“writeonce,runanywhere.”(一次编写,到处运行)的平台无关性的概念,与Internet的异构网络互连一拍即合,它特别适合于在网络开发中使用面向对象的程序设计语言Java语言是一种面向对象的程序设计语言,它通过描述对象本身以及对象间的相互关系,并通过激发对象间的相互作用,来求解问题对现实世界中事物的对象,要由两个部分来描述,一是其静态属性——对象的状态,用“数据”来描述;一是其动态属性——对象的行为,用“方法”来描述在面向对象的程序设计语言中,并不是去定义一个一个的对象,而是先定义同一类对象的模板——类(class),再从类创建其对象电子时钟的Java描述电子时钟的静态属性——电子时钟的状态,用变量hour(时)、minute(分)、second(秒)描述电子时钟的动态属性——电子时钟的行为,如显示时间,设置时间等,用以下方法描述:

·getMinute()——显示“分”;

·getHour()——显示“时”;

·setSecond()——设置“秒”;

·setMinute()——设置“分”;

·setHour()——设置“时”。classTimeClock{ privateintiSecond,iMinute,iHour; publicintgetMinute(); //显示“分”

publicintgetHour(); //显示“时”

publicvoidsetSecond(); //设置“秒”

publicvoidsetMinute(); //设置“分”

publicvoidsetHour(); //设置“时”}类描述符类名整数描述符语句结束符注释符类体类的首部私有访问权限修饰符公共访问权限修饰符相关说明从结构上看,类由类的首部和类体构成类体由紧随类的首部的一对花括号及花括号中的一些语句组成类体中含有类的数据部分和类的方法部分,分别称为类的成员变量和成员方法,它们都是类的成员方法由方法首部和方法体组成有些方法执行后要向调用者(不是标准输出)送回一个数据,这样的数据称为方法的返回值注释是对程序、程序的局部或一个语句的说明,用于增加程序的可读性这个TimeClock是一个时钟类的界面,当此界面中所有方法的方法体都定义后,就构成了一个时钟类,由这个时钟类可以创建多个时钟对象Java是区分大小写字母的语言程序员可以自己定义类,也可以使用事先已经定义好的类本例只是电子时钟类的设计的一个例子,它不是唯一的计算圆的周长和面积classCircle{ floatr; //半径

finaldoublePI=3.14159; //最终变量

Circle(floatd){ //构造方法

r=d; }

doublecircum(){ //求圆周长的方法

return2*PI*r; }

doublearea(){ //求圆面积的方法

returnPI*r*r; }}Circle类中含有两个数据成员半径r和一个常数PI(π),r使用了float型,PI使用了double型数据类型名(关键字)占用内存空间数值范围十进制表数精度int4字节-231~231-1float4字节(±3.4028235E+38f)~(±1.40239846E-45f)6~7位double8字节(±1.79769313486231570E+308)~(±4.94065645841246544E-324)15位finalPI由于加了“final”,表示在程序执行过程中其值不能再变化,PI称为最终变量。最终变量在程序中一般用大写Circle类中定义了方法的结构方法首部方法体{}

方法首部描述方法名方法的返回值类型参数及其类型其他修饰符Java基本的运算符+(加),-(减或负),*(乘),/(除)>(大于),>=(大于等于),==(等于),<(小于),<=(小于等于),!=(不等于)=称为赋值号,意即将其右面的值送到左面的变量中,相当于往一个内存单元中存放入一个数据值。类的构造方法类的构造方法与类同名,描述由类生成对象的操作,在创建对象时由系统调用。下面的主类定义中给出了构造方法的作用主类Java应用程序由很多类组成,其中有且只有一个主类。含有主方法main()的类称为Java应用程序的主类。Java规定,主类名必须与主类所在的文件名相同。程序运行后,Java首先执行主类主方法中的第一个语句主类—UseCircle的定义classUseCircle{ publicstaticvoidmain(Stringargs[]){ CircleaCirc=newCircle(5.3f); //生成一个圆对象

doubles=aCirc.circum(); //计算该圆对象的周长

doubled=aCirc.area(); //计算该圆对象的面积

System.out.println("半径为:"+aCirc.r+"的圆的周长为:"+s); //输出周长

System.out.println("半径为:"+aCirc.r+"的圆的面积为:"+d); //输出面积

}}说明UseCircle类中,首先用new命令来调用Circle类的构造方法来创建一个Circle类的对象aCirct用语法形式:对象名.成员名;调用Circle类中的成员调用系统方法System.out.println()输出结果Java平台Java平台是一种纯软件平台,它需要其它基于硬件的平台(如Window2000,Linux等)的支持。Java平台由Java虚拟机(JavaVM)和Java应用程序接口(JavaAPI)两部分组成。Java虚拟机易于被移植到基于不同硬件的平台上,是Java平台的基础;Java应用程序接口由大量已做好的Java组件(组件是一种类)构成,这个接口提供了丰富的Java资源。Java虚拟机由于不同的机器有不同的机器语言,并且由于操作系统环境的排他性,使得在一种平台上开发的程序运行到另一个平台上时,多少还要进行一些修改,这样就比较麻烦Java破解各机器不同的机器语言的策略是定义出自己的一套虚拟机器——Java虚拟机Java虚拟机的工作原理编写Java程序Java编译器Java源代码(*.java文件)字节码(*.class文件)Java虚拟机Java解释器forWindowsJava解释器forUnixJava解释器forMacOSPC计算机Unix服务器Mac计算机Java一台Java虚拟机就是一台Java解释器。经过Java解释器的解释,才得到具体的机器可以执行的代码通常把Java程序的翻译过程称为半编译、半解释。而其他语言程序要么是全编译,要么是全解释Java既是一种语言,也是一种平台。作为一种语言,Java通过所谓“半编译、半解释”使得Java程序具有“一次编写,到处运行”的特点两类Java程序按照运行环境的不同,可将普遍使用的Java程序分为两种:Java应用程序(JavaApplication)。其是在本机上由Java解释程序来激活Java虚拟机JavaApplet(Java小应用程序)。其是通过浏览器来激活Java虚拟机它们都是在Java虚拟机中执行JavaApplication在Java语言中,每个应用程序都是以类的形式出现的。一个程序中既可以只包含一个类,也可以包含多个类,此时称为是一个多类程序。Java提供了一个特殊的方法——main()方法,每个应用程序的执行都是从主方法main()开始的,没有main()方法的应用程序是不能执行的。包含了main()方法的类叫做主类,程序的主文件名必须与主类相同一个问候程序该程序的功能是在屏幕上显示一个问候:

Hello,World!问候程序Java代码classHelloWorld{ publicstaticvoidmain(StringArgs[]) { System.out.println(“Hello,World!”); }}main()方法main()方法是JavaApplication程序的入口,有着固定的书写格式:publicstaticvoidmain(Stringargs[]){…}其中:·public表明所有的类都可以使用这一方法;·static指明该方法是一个静态方法,可以通过类名来直接调用;·void则表示main()方法不返回任何值;·main(Stringargs[])是该方法的头部,圆括号内是该方法可接受的参数。Java解释器总是从main()方法开始解释和执行应用程序,因此一个可执行的Application必须而且只能有一个main()方法本例中只有一条语句:System.out.println("Hello,World!");其中,System是一个系统类,System.out指代了标准输出流,通过它的println()方法可以往标准输出设备上输出数据JavaAppletimportjava.applet.Applet; //将java.applet包中的系统类Applet引入本程序importjava.awt.Graphics; //将java.awt包中的系统类Graphics引入本程序publicclassHello_AppletextendsApplet{ publicvoidPaint(Graphicsg) { g.drawString(“Hellowold!),50,25); }}引入系统类语句类的首部类体关键字表示引入系统类import关键词import用于将系统类引入本程序本例中引入了两个系统类——Applet和Graphics。这两个系统类分别位于不同的系统包java.applet和java.awt中引用一个系统类时需要指明它们所在的包名类的声明Applet与Application在结构上是有较大不同的,最主要体现在Applet中没有main()方法一般来说,Applet中的类必须是公共的(用public来修饰)或有一个public型的构造方法,而且必须有一个类是系统类Applet的子类所谓一个类是另一个类的子类,就是说一个类继承了另一个类,两个类之间存在继承关系。类的派生AppletHello_Applet…子类父类JavaApplet程序JavaApplet不像JavaApplication那样是一个独立的程序,它虽然也要先经过半编译生成字节码文件,但是这个字节码文件不能够直接被执行和使用。按照约定,它必须由支持Java的WWW浏览器(如IE、Netscape、Hotjava等)或appletviewer加载执行Applet运行的完整过程源代码(*.java文件)字节码(*.class)文件Java编译器HTML文件……Applet嵌入标记……WWW服务器②下载HTML文件①请求HTML文件WWW浏览器③请求Applet字节码④下载Applet字节码⑤解释执行Applet字节码Java程序开发环境——SDK工欲善其事,必先利其器。为了支持用户的Java程序开发但是,SUN公司开发的Java2SDK(Java2SoftwareDevelopmentKit)比较适合初学者使用SDK集成有如下一些功能Java编译器;Java解释器:内附Appletviewer——AppletBytecode解释器;内附Java——Application解释器。简单的除错工具。1.2Java程序开发过程1Java应用程序开发过程举例2JavaApplet开发过程举例1.2Java程序开发过程Java应用程序开发过程举例编辑——创建Java源程序.源程序用Java编程语言直接编写的程序,通常是由一个或多个类组成的正文文件,后缀为.java

半编译——用Java编译器(Javac)将Java源程序翻译成Java虚拟机(theJavaVirtualMachine,简称JavaVM)能理解的指令、再将这些指令组织为字节码文件将源程序编译为字节码文件(后缀为.class)的过程半解释(运行)——Java虚拟机(Java)解释、运行包含在字节码文件中的程序创建源文件保存过程输入完毕,检查无错后,应将这些代码保存到一个文件中。Java规定,Java应用程序源代码后缀名必须为.java

半编译在JDK中,Java的编译器是javac.exe。使用javac命令,就可以将Java源文件编译成字节码javac命令的一般格式为:

javac<文件名>.java

path路径设置path环境变量应指定操作系统到什么地方去查找Java工具,并可以将当前所用机器的Java工具所在的路径(一般在JDK文件夹下的BIN子文件夹中)赋给path环境变量。例如:path=%path%;c:\JDK1.2.2\BIN半解释——运行编译生成的字节码文件可以在本机中由java解释器——java.exe运行。java命令的一般格式为: java文件名

classpath环境变量classpath环境变量指定Java工具到什么地方去查找类文件(.class文件)。系统提供的类文件相关信息一般在JDK文件夹下的LIB子文件夹中,然后还需将用户自己的类文件所在文件夹赋给classpath环境变量。例如:setclasspath=c:\jdk1.2.2\lib\.;d:\javaprogramHelloWorld程序的编译、运行过程向应用程序传递参数Java应用程序通常是在命令行下运行的,允许用户在这个命令行中向它传递信息,运行时向程序传送数据,增加了该程序的通用性假设用下面的命令来运行程序:javaWhoSayWhatMarry"GoodDay!"那么程序的运行结果为:Marrysay:GoodDay!JavaApplet开发过程举例JavaApplet的创建过程也是分为三步:编辑、编译和运行,其前两个步骤与Application大致相同。但由于Applet是不独立的小应用程序,所以不能直接用java命令来执行第二步生成的字节码文件,而是应该另外创建一个可以嵌入该Applet字节码的HTML文件,然后由支持Java的WWW浏览器或appletviewer来加载执行。创建源文件半编译用Java编译器来进行源文件的编译,格式如下:

javacHello_Applet.java结果也是在当前文件夹下产生字节码文件Hello_Applet.class创建HTML文件Applet是不独立的程序,不能够直接被执行和使用,必须由支持Java的WWW浏览器或appletviewer加载执行。在执行小应用程序之前,必须先准备一个供其栖身的HTML文件,使用特殊的HTML标记,把Applet嵌入其中HTML标记形式<appletcode="……"width=……height=……>……</applet>其中,<applet>和</applet>说明在此插入一个Applet,字节码文件的名字放在“code=”后(扩展名.class,必不可少!),而width和height参数说明了此Applet占用的宽度和高度Hello.html文件运行Appletviewer程序可以在JDK的bin文件夹下找到,用它可以浏览嵌有Applet的HTML文件。appletviewer.exe的一般格式为:appletviewer<文件名>.html在MS-DOS平台上,要浏览本例,只需输入命令:

appletviewerHello.html

方法设计方法的基本概念运算符与表达式流程控制语句算法设计举例方法的基本概念Java类由状态(或属性)和行为两部分组成。属性是保存描述类对象状态数据的途径,但属性并不具备任何活动能力。一个类要真正能完成一定的操作,就必须为类创建行为。行为描述了该类需要完成的每项具体任务所用的不同程序段,每个这样的就叫做“方法”方法分类在Java程序中,用“数据”来描述类的属性,用“方法”来实现类的行为。方法可分为成员方法(instancemethod)和类方法(classmethod,即由static修饰的方法,又叫做静态方法)两种方法的声明描述方法的处理过程及其所需的参数,并用一个方法名来标识这个处理过程方法定义中的参数并没有实际值,仅仅是为了描述处理过程而引入的,因此称为形式参数(简称形参)方法的使用

通过向客体发送消息执行方法所定义的处理功能。使用方法时给出参数的实际值,这些实际值称为实际参数(简称实参)方法首部的声明语法形式如下:

[方法修饰符]方法返回值类型

方法名([形式参数表])其中:方法修饰符可以是static、final以及public、private和protected等。static、final本书不作专门介绍,“方法修饰符”是可选的语法部分。方法返回值类型说明方法返回值的数据类型,可是Java基本数据类型,也可是复合数据类型。当无返回值时,其返回值类型须说明为void。方法名标识所声明的方法,必须是合法的Java标识符;形式参数表说明方法所需要的参数,当方法有多个参数时,参数间需用逗号“,”隔开;当方法没有参数时,可以没有“形式参数表”部分。形式参数的作用域是整个方法体。方法体方法体是一个语句序列,这一语句序列具体描述方法的返回值、方法的参数和方法所在类的成员变量之间的关系,以实现方法的功能。方法体中可以定义其内部使用的局部变量,其作用域是整个方法体。方法的返回值若方法的返回值类型不是void时,方法体中必须用return语句来返回一个方法声明时指定类型的值。return语句的语法形式为:

return[表达式];其中,return是关键字。方法声明的例子方法setCNumber:voidsetCNumber(intxNumber) //方法首部声明:无方法修饰符,方法名为//setCNumber,方法的参数为xNumber,这一方法//无返回值{//方法体开始

cNumber=xNumber; //方法体中的语句,描述方法的功能}//方法体结束方法getCNumberintgetCNumber()//方法首部声明:无方法修饰符,方法名为//getCNumber,这一方法无参数,这一方法

//的返回值类型为int{//方法体开始returncNumber;//将cNumber的值作为getCNumber方法的返回值}//方法体结束方法的调用与参数传递调用对象成员方法的语法形式为:

对象名.成员方法名([实际参数表]);对象名指定所使用的对象;成员方法名指定所要调用的成员方法;实际参数表是0个或多个表达式构成,多个表达式之间用逗号“,”分隔。实际参数的个数、顺序及类型应与被调用方法的形式参数表中的形式参数一致。调用对象成员方法的语义计算实际参数表中(各)表达式的值,并将它(们)一一传送给被调用方法中对应的形式参数,执行被调用方法的方法体。方法调用的结果就是被调用方法的执行结果实现两float型数相加的方法例子classMethodDemo1{ floatadd(floatx,floaty)

//建议所取的方法名有助于说明方法的功能,以便阅读程序和记忆

{ floatz;

//z是方法体的局部变量,作用域是整个add方法的方法体

z=x+y; returnz; }}classTryMethodDemo1{ //主类

publicstaticvoidmain(Stringargs[]){ MethodDemo1a=newMethodDemo1(); System.out.println(a.add(5,8)); }}实现两float型数相加的方法例子二classObjPara{//定义对象作为参数的类,为便于举例,本方法只有一个成员变量

floattemp;}classMethodDemo2{voidadd(floatx,floaty,ObjParaz){//方法首部声明,此方法没有返回值。

z.temp=x+y;//将x+y的结果存入类变量z的成员变量temp中。

}}classTryMethodDemo2{//主类

publicstaticvoidmain(Stringargs[]){ObjParab=newObjPara(); MethodDemo2a=newMethodDemo2(); a.add(4,6,b); System.out.println(b.temp); }}演示方法之间的消息发送与参数传递classMethodDemo3{ floatadd(floatx,floaty){ floatz; z=x+y; returnz; } voidcallAdd(floatm,floatn){ floatt; t=add(m,n);

/*向方法add发消息,将参数m,n的值分别传递给x,y,然后执行 方法add的方法体,计算x+y,计算结果作为add的返回值传回给t*/ System.out.print(m+"+"+n+"="+t); }}classTryMethodDemo3{ //主类

publicstaticvoidmain(Stringargs[]){ MethodDemo3a=newMethodDemo3(); a.callAdd(4,6); }}方法间的消息发送与参数传递演示二classObjPara{ floattemp;}classMethodDemo4{ voidadd(floatx,floaty,ObjParaz){ z.temp=x+y; } voidcallAdd(floatm,floatn){ ObjParak=newObjPara(); add(m,n,k);/*向方法add发消息,将参数m,n的值分别传递给x,y,并将k的存储地址值传送给z,然后执行方法Add的方法体,计算x+y,计算结果通过对象k的成员temp传回*/ System.out.print(m+"+"+n+"="+k.temp); } //k.temp的值即为m+n}classTryMethodDemo4{ //主类

publicstaticvoidmain(Stringargs[]){MethodDemo4a=newMethodDemo4(); a.callAdd(4,6); }}2.2运算符与表达式1赋值运算2算术运算3关系运算4逻辑运算5位运算符6三元运算7其它运算符基本定义对数据进行的操作称为运算表示各种不同运算的符号称为运算符参于运算的数据称为操作数(operand)表达式(Expression)是由操作数和运算符按一定的语法形式组成的符号序列通过算术运算符将运算对象连接起来的式子,就称为算术表达式

Java语言的运算符分类运算符结合性一元运算符+-++--!~()*右算术运算符*/%左+-移位运算符<<>>>>>左比较运算符<<=>>=instanceof左==!=按位运算符&左^|短路运算符&&左||条件(三元)运算符?:右赋值运算符=“op=”(复合赋值运算符)右1赋值运算给新定义的变量进行初始化或修改变量的内容需要用到赋值运算。赋值运算的一般形式为:

变量

=表达式;复合赋值运算符

在赋值运算符“=”之前加上其它运算符<op>,就构成了复合赋值运算符“<op>=”复合赋值运算符“<op>=”集成了计算和赋值两大功能,对于任何类型兼容的表达式x和y来说,x<op>=y复合赋值运算符包括:*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=和|=2算术运算算术运算符作用于整型或浮点型数据,完成算术运算。按操作数个数来分,有一元算术运算符和二元算术运算符

一元算术运算符运算符用法描述++op正值--op负值++++op或op++加1----op或op--减1++和--算术运算符称为增一运算符和减一运算符可以作为前缀运算符可以作为后缀运算符++和--运算符及用法运算符用法描述++x++表达式x++的值为x,然后x的值增1++++x表达式++x的值为x+1,x的值增1--x--表达式x--的值为x,然后x的值减1----x表达式--x的值为x-1,x的值减1二元算术运算符运算符用法描述+op1+op2操作数op1加上op2-op1-op2操作数op1减去op2*op1*op2操作数op1乘以op2/op1/op2操作数op1除以op2%op1%op2求操作数op1除以op2的余数(取模)整数算术运算的除法和取模遵循以下等式 (a/b)*b+(a%b)==a对于浮点算术运算来说

a%b和a-((int)(a/b)*b)的语义相同在取模运算时,假设操作数中至少有一个负数,那么一般采取这样一个有用的规则先忽略掉所有操作数的符号来计算得到结果,然后将“%”左边的操作符的符号赋给它得到最终答案一个算术运算的例子publicclassArithmaticOp{publicstaticvoidmain(Stringargs[]){ inta=5,b=3; intc=++a/b; intc2=a--/b; intc3=a*2%b; doubled=2.5; doubled2=d%3; System.out.println("c="+c); System.out.println("c2="+c2);

System.out.println("c3="+c3); System.out.println("d2="+d2);}}3关系运算关系运算实际上就是比较运算,它的运算结果是一个布尔类型的值。如果两个运算对象符合关系运算符所要求的比较关系,则关系运算结果为true,否则为false。Java语言提供的关系运算符都是二元运算符关系运算符运算符用法功能>op1>0p2如果op1大于op2则结果为true,否则为false>=op1>=op2如果op1大于或等于op2则结果为true,否则为false<op1<op2如果op1小于op2则结果为true,否则为false<=op1<=op2如果op1小于或等于op2则结果为true,否则为false==op1==op2如果op1等于op2则结果为true,否则为false!=op1!=op2如果op1不等于op2则结果为true,否则为false关系表达式

用关系运算符将两个相同类型的表达式连接起来的的式子,称为关系表达式

3>5 ‘a’<’z’ x+y!=z都是合法的关系表达式赋值(“=”)和等价比较(“==”)关系运算符(<、<=、>、>=)一般适用于两侧的操作数均为整数型、浮点型或字符型数据的情形,布尔型数据只能用在==或!=比较中。关系运算符(<、<=、>、>=)连接的表达式本身不能是关系表达式。例如:x>y>z是非法的。关系运算的结果不能存放在一个非布尔型变量中一个关系运算的例子publicclassRelationOp{publicstaticvoidmain(Stringargs[]){inta=25,b=3;booleand=a>b; booleand1=3.5<2.6; booleand2='A'<='A'; booleand3=false!=true; booleane=a>=a*2-b*9;System.out.println("d="+d); System.out.println("d1="+d1); System.out.println("d2="+d2); System.out.println("d3="+d3); System.out.println("e="+e);}}4逻辑运算关系运算只能表示一个简单的条件,而逻辑运算可以将几个关系表达式或者布尔值连接起来,表示一个较复杂的条件逻辑运算的运算对象必须是布尔值类型的表达式,运算结果也是布尔值类型的数据逻辑运算符运算符用法功能分类!(逻辑非)!op1op1为true,则结果为false,否则为true。一元&&(逻辑与)op1&&op2op1和op2都为true,则结果为true,否则为false。二元||(逻辑或)op1||op2op1和op2都为false,则结果为false,否则为true。逻辑运算的真值表xy!x!yx&&yx||ytruetruefalsefalsetruetruetruefalsefalsetruefalsetruefalsetruetruefalsefalsetruefalsefalsetruetruefalsefalse短路运算符

“&&”和“||“又叫做短路运算符在由它们连接组成的逻辑表达式的求解过程中,总是先求出运算符左边的表达式的值,再根据具体情况决定是否需要计算运算符右边的表达式对“||”运算,如果左边的表达式的值为true,则不必对运算符右边的表达式再进行运算,整个表达式的结果就为true对“&&”运算,如果左边的表达式的值为false,则不必对运算符右边的表达式再进行运算,整个表达式的结果就为false。关系运算符和逻辑运算符共用的例子publicclassRelationAndConditionOp{publicstaticvoidmain(Stringargs[]){inta=28,b=3;inte=3;if(e!=0&&a/e>5)System.out.println("a/e="+a/e);intf=0;//下面不会发生除零溢出的错误,因为e!=0为false,所以不需要对a/f进行运算。

if(f!=0&&a/f>5)System.out.println("a/f="+a/f);elseSystem.out.println("f="+f);}}5位运算符位运算符用来对二进制位进行操作,其操作数只能为整型或字符型数提示:在Java中,使用补码来表示二进制数,最高位为符号位,正数的符号位为0,负数的符号位为1位运算符运算符用法描述分类~~op1按位取反运算按位运算符一元&op1&0p2按位与运算二元|op1|0p2按位或运算^op1^0p2按位异或运算<<op1<<0p2左移运算移位运算符>>op1>>0p2带符号右移运算>>>op1>>>0p2不带符号右移运算4种按位运算“~”是按位取反运算符“&”是按位与运算符“|”是按位或运算符“^”是按位异或运算符按位取反运算符对数据的每个二进制位取反,即把1变成0,把0变成1。例如:

~00001111=11110000“&”是按位与运算符要求有两个操作数进行运算。如果两个相应位均为1,则该位的结果为1,否则结果为0。即:

0&0=00&1=0 1&0=01&1=1提示: 对某个数中某些特定的位清零 用来取某个数中某些指定的位“|”是按位或运算符只要两个相应位中有一个为1,则该位的结果为1,否则结果为0。即:

0|0=00|1=1 1|0=11|1=1提示: 按位或运算可以用来将某个数中某些特定的位置1“^”是按位异或运算符同样要求有两个操作数进行运算。如果两个相应位相同,则该位的结果为0,否则结果为1。即:

0^0=00^1=1 1^0=11^1=0提示:

用来使某个数中某些特定的位取反 实现两个值的交换,而不需使用临时变量

布尔型操作数上时的运算规则Op1Op2Op1&Op2Op1|Op2Op1^Op2truetruetruetruefalsetruefalsefalsetruetruefalsetruefalsetruetruefalsefalsefalsefalsefalse其它3种移位运算(a)左移运算(<<)(b)带符号右移运算(>>,又称为算术右移)(c)不带符号的右移运算(>>>,又称为逻辑右移)移位运算的例子x(十进制表示)x的二进制补码表示x<<2x>>2x>>>23000011110011110000000011100000111-17111011111011110011111011001110116三元运算条件运算符“?:”比较特殊,是Java语言中仅有的一个三元运算符,它的一般形式为:

表达式1?表达式2:表达式3其中表达式e1的值必须是布尔值类型,如果该值为true,则对表达式e2进行求值,并将e2的求值结果作为整个表达式的值;否则对表达式e3进行求值并将e3的结果作为整个表达式的值。一个条件运算符的例子/*编程从三个整数x,y,z中选出最大和最小者。*/classMax2{publicstaticvoidmain(Stringargs[]){intx=335;inty=212;intz=38;inta,b,max,min;System.out.println("原来的整数的值为:x="+x+",y="+y+",z="+z);a=(x>y?x:y);max=(a>z?a:z);b=(x<y?x:y);min=(b<z?b:z);System.out.println("最大的元素的值为:"+max);System.out.println("最小的元素的值为:"+min);}}7其它运算符这里主要介绍对象运算符instanceof

它也可以说是一种比较运算符,用来判断一个运行时的对象是否属于某个指定类或其子类的实例,如果是则返回true,否则返回false其一般形式为:

对象名

instanceof类名对象运算符的用法publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){ …//dosomethingasaContractor}else{ …//dosomethingelse} }2.3流程控制语句语句类型关键字循环while,do-while,for选择if-else,switch-case转向控制break,continue,label:,return*异常处理try-catch-finally,throw重点说明流程控制语句1循环结构(LoopConstructs)2选择语句(SelectionStatements)LoopConstructs循环的作用是反复执行同一块代码直到满足结束条件三种循环语句:

1)while语句

2)do-while语句

3)for语句while语句while语句实现“当型”循环,它的语法形式为:

while(布尔表达式)

循环体

while语句用于在布尔表达式(即测试条件)的值保持为真(true)时反复地执行其中的内嵌语句(一般叫做循环体)

while语句的流程图循环体布尔表达式true例求100以内所有奇数的和

publicclassWhileDemo{publicstaticvoidmain(String[]args){inti,sum;sum=0; //计数器清0i=1; //i的初始值为1(因为1是最小的奇数)

while(i<=100){sum+=i;i+=2; //奇数的间隔为2}System.out.println(sum);}}do-while语句do-while语句实现“直到型”循环,它的语法形式如下:

do

循环体

while(布尔表达式);

do-while语句执行的过程为:先执行一次循环体中的语句,然后测试布尔表达式的值。如布尔表达式的值为真,那就返回执行循环体中的内容

do-while语句的流程图布尔表达式循环体falsetrue例求100以内所有奇数的和

publicclassDoWhileDemo{ publicstaticvoidmain(String[]args){ inti,sum; sum=0; //计数器清0 i=1; //i的初始值为1 do{ sum+=i; i+=2; }while(i<=100); System.out.println("sum="+sum); }}do-while语句和while语句的不同之处do-while语句总是先进入循环,然后检测条件,再决定是否继续循环while语句是先测试条件,再决定是否进入循环所以,用do-while语句时,循环体至少执行一次。体会while语句publicclassWhileDemo2{ publicstaticvoidmain(String[]args){ inti=88; while(i<88){ System.out.println("Print"+i); i++; } }}此例的运行结果是什么也不输出体会do-while语句publicclassDoWhileDemo2{ publicstaticvoidmain(String[]args){ inti=88; do{ System.out.println("Print"+i); i++; }while(i<88); }}此例的运行结果是:Print88for语句实现“当型”循环,它的语法形式为:

for(表达式1;表达式2;表达式3)

循环体

每个for语句都有一个用于决定循环开始和结束的变量,通常称这个变量为循环控制变量

for语句的执行过程先求解表达式1;求解表达式2,若其值为true,则执行for语句中的循环体,然后执行下面第(3)步。若值为false,则结束循环,转到第(5)步。求解表达式3。转回上面第(2)步继续执行。执行for语句下面的一个语句。for语句的流程图求解表达式1表达式2循环体求解表达式3for语句的下一语句truefalse例求100以内所有奇数的和

publicclassForDemo{ publicstaticvoidmain(String[]args){ intsum; sum=0; //计数器清0 for(inti=1;i<=100;i+=2){ sum+=i; } System.out.println(sum); }}例求1+2+…+999的和

/*试for后分号的作用*/publicclassForDemo2{ publicstaticvoidmain(String[]args){ intsum=0; inti; for(i=1;i<1000;i++);//注意此处圆括号后面有一个分号

{ sum+=i; } System.out.println("i="+i);System.out.println("sum="+sum);}}循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套内嵌的循环中还可以嵌套循环,这就是多重循环上述三种循环(while循环,do-while循环和for循环)语句之间可以相互嵌套使用。例输出一个0~9的乘法表

publicclassMultiTable{ publicstaticvoidmain(Stringargs[]){ intb,c,a; for(b=0;b<=9;b++){ for(a=0;a<=b;a++) System.out.print(a+"*"+b+"="+a*b+'\t'); System.out.println(); } }}循环结构中的continue语句continue语句的一般语法格式为:

continue[标号];其中,用“[]”括起的标号部分是可选的,分两种使用情况:不带标号的使用情况:此时,continue语句用来结束本次循环(对于for语句,在进行循环条件的判断之前,还要先改变循环控制变量的值(即先执行表达式3))带标号的使用情况:此时,continue语句跳过标号所指语句块中所有余下部分的语句,回到标号所指语句块的条件测试部分进行条件判断,以决定循环是否继续执行。例不带标号的continue语句classEndInnerLoop{ publicstaticvoidmain(Stringargs[]){ System.out.println("21世纪的闰年有:"); intn=0; //计数

for(intyear=2000;year<3000;year+=4){ if(year%100==0&&year%400!=0) continue; System.out.print(year+"\t"); n++; if(n<10) continue; System.out.println(); n=0; } }}例带标号的continue语句classContinueLabel{ publicstaticvoidmain(Stringargs[]){ outer: for(inti=0;i<10;i++){ for(intj=0;j<10;j++){ if(j>i){ System.out.println(""); continueouter; } System.out.print(""+i+"*"+j+"="+(i*j)); } } }}打印一个三角形的0至9的乘法表break语句测试的条件为true,也希望循环立即终止,这时可以用break语句实现此功能break语句与continue语句一样,对循环的执行起限定转向的作用与continue语句只能在循环中使用不同,break语句除了可以用在循环语句中之外,亦可以用于switch语句中continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环语句的执行break语句的一般语法格式break语句的一般语法格式为:

break[标号];其中,用“[]”括起的标号部分是可选的。分两种使用情况:不带标号的情况:其功能是终止break所在的循环,转去执行其后的第一条语句。在执行时有两个特点:一是在有多重循环时,它只能使循环从本层的循环跳出来;二是此时程序一定转移到本层循环的下一个语句。带标号的情况:其功能是终止由标号指出的语句块的执行,并从紧跟该块的第一条语句处开始往下执行。典型用法是实现从其所处的多重循环的内部直接跳出来,只要在欲跳出的循环开始处加上标号即可。例不带标号的break语句publicclassBreakDemo{publicstaticvoidmain(String[]args){ intn=0; //计算素数的个数

intb=999;outer: //外层循环,定义一个标号

do{ b+=2; intm=(int)(Math.ceil(Math.sqrt(b))); for(inti=2;i<=m;i++){//内层循环,判断b是否为素数

if(b%i==0) continueouter; } n++; if(n==3) break; }while(true); System.out.println("大于1000的第三个素数为:"+b);}}例带标号的break语句publicclassBreakDemo{ publicstaticvoidmain(String[]args){ intsum=0; coloop: //定义标号

while(sum<=100){ for(intcount=1;count<10;count++){ sum+=count; if(sum>60) breakcoloop; } } System.out.println("sum="+sum); }}SelectionStatements选择语句提供了一种控制机制,使得程序根据相应的条件去执行对应的语句Java中的选择语句有两个:

1)负责实现两路分支的if-else语句

2)负责实现多路分支的switch语句。if-else语句简单形式

if-else语句的一般语法形式为:if(布尔表达式){

语句1}[else{

语句2

}]if语句的流程图无else部分

truefalse语句1后续语句布尔表达式if语句的流程图有else部分布尔表达式truefalse语句1语句2后续语句例没有else部分的if语句classIfExam{publicstaticvoidmain(String[]args){ System.out.println("请输入一个要求其绝对值的数:"); if(args.length!=1){ System.err.println("请重新执行,一定要输入一个数!"); System.exit(-1); } doublenumber=Double.valueOf(args[0]).doubleValue(); System.out.print("你输入的数是:"+number); if(number<=0) number=-number; System.out.println("该数的绝对值为:"+number); }}例有else部分的if语句classIfTry{publicstaticvoidmain(String[]args){ System.out.println("请输入你的成绩:"); if(args.length!=1){ System.err.println("请重新执行,一定要输入一个整数!"); System.exit(-1); } intnumber=Integer.parseInt(args[0]); if(number>=60){ System.out.println("祝贺你,你及格了!"); } else{ System.out.println("真遗憾,你没及格,请继续努力!"); }}}if-else语句嵌套形式 if语句中内嵌的语句1或语句2又是if语句的情况称为if语句的嵌套,其常用形式为:

if(布尔表达式1) {

语句1 } …… elseif(布尔表达式m) {

语句m } else {

语句n }例实现多重嵌套classIfSeason{publicstaticvoidmain(String[]args){ System.out.println("请输入一个有效月份:"); if(args.length!=1){ System.err.println("请重新执行,一定要输入一个整数!"); System.exit(-1);} intmonth=Integer.parseInt(args[0]); System.out.print("你输入的月份是:"+month); Stringseason; if(month==12||month==1||month==2){ season="冬天"; }elseif(month==3||month==4||month==5){ season="春天"; }else{ season=“无效的月份或夏天、秋天!请重新执行。";} System.out.println("所处季节为:"+season);}}switch语句上面所讲的if语句的嵌套形式虽然能够实现多路分支,满足程序流程控制的要求,但是它欠缺灵活性,程序书写比较麻烦,而且可读性不太好在Java中,为多路选择流程控制专门提供了一个语句--switch语句switch语句根据一个供进行判断的表达式的结果来执行多个操作中的一个语法形式switch(表达式){case常量1:

语句1 [break;]case常量2:

语句2 [break;] …case常量n:

语句n [break;][default:

缺省处理语句

[break;]}switch语句的流程图常量1语句1缺省处理语句default常量n表达式常量2语句2语句nbreakbreakbreakbreak…后续语句switch语句的注意点使用switch语句时,要注意用作判断的表达式必须是符合byte,char,short,int类型的表达式,而不能使用浮点类型或long类型,也不能为一个字符串;switch语句将表达式的值依次与每个case子句中的常量值相比较。如果匹配成功,则执行该case子句中常量值后的语句,直到遇到break语句为止;case子句中常量的类型必须与表达式的类型相容,而且每个case子句中常量的值必须是不同的;default子句是可选的,当表达式的值与任一case子句中的值都不匹配时,就执行default后的语句。(e)break语句用来在执行完一个case分支后,使程序跳出switch语句,执行switch语句的后续语句。(f)在一些特殊的情况下,例如多个不同的case值要执行一组相同的操作,可以写成如下形式:

case常量n:

case常量n+1:语句

[break;](g)case分支中包括多个执行语句时,可以不用花括号“{}”括起;(h)通过if-else语句可以实现switch语句所有的功能。但通常使用switch语句更简练,且可读性强,程序的执行效率也高;例用switch语句实现判断某月份

classSwitchSeason{publicstaticvoidmain(String[]args){System.out.println("请输入一个有效月份:");

if(args.length!=1){ System.err.println("请重新执行,一定要输入一个整数!"); System.exit(-1); }intmonth=Integer.parseInt(args[0]); System.out.print("你输入的月份是:"+month);Stringseason;switch(month){case12:case1:case2:se

温馨提示

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

评论

0/150

提交评论