ch3Java语言基础.ppt_第1页
ch3Java语言基础.ppt_第2页
ch3Java语言基础.ppt_第3页
ch3Java语言基础.ppt_第4页
ch3Java语言基础.ppt_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

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

文档简介

2019/7/14,1,标识符、关键字和类型 表达式与程序流控制 数组,主要内容,2019/7/14,2,标识符,标识符包括: 变量名,类名,方法(函数)名 以字母,_,或$开头 大小写敏感,且长度没有限定 如: username user_name _sys_varl $change,2019/7/14,3,风格约定: _, $不作为变量名,方法名开头 变量名、方法名首单词小写,其余单词只有首字母大写 如anyVariableWorld 接口名、类名首单词第一个字母大写。 常量:完全大写 注释:/ 注释一行 /* */ 注释一行或多行 /* 可用javadoc命令转化为HTML文件*/,2019/7/14,4,关键字,* 当前不使用 * 为Java 2 增加的,2019/7/14,5,数据类型,2019/7/14,6,Java 基本数据类型,逻辑型(布尔型) 文字型 整数类型 浮点型,2019/7/14,7,逻辑型:boolean, 取值:true , false 例如:boolean truth = true;,逻辑型,2019/7/14,8,文字型:char 、String char: 16位的unicode(国际码)字符。 如 char mychar=Q; unicode字符集是一套字符编码系统,可以支持 各类文字的字符,达34168个字符。 定义形式:a; t; u String 是类,String greeting=“Good Morning! n”;,文字型,2019/7/14,9,整数类型:byte, short, int 和 long,类型 长度 取值范围 byte 8位 -27 27-1 short 16位 -215 215-1 int 32位 -231 231-1 long 64位 -263 263-1,整数类型,2019/7/14,10, Java中缺省整型是 int 可有3种形式:十进制、八进制、十六进制 十进制 八进制 十六进制 int 24 0771 0XAB07 long 24L 0771L 0XAB07L,整型常量,2019/7/14,11,浮点型:float 和 double 长度:float: 32位 double: 64位 缺省是 double 类型,如3.14 (double 型) 表达方法: E或e - 科学记数法, 6.02e23 F或f - 表示float类型, 6.02e23F D或d - 表示double 型, 2.718D,浮点型,2019/7/14,12,类的初步概念,“日期”类型的两种不同表达: 方式一: int day, month, year; /定义年、月、日 int d1,m1,y1; / 定义一个日期 int d2,m2,y2; /定义另一个日期 方式二: class Date int day; int month; int year; void setDate( int a, int b, int c). Java用class创建新的类型。,2019/7/14,13,类的变量的声明与引用,在Java中,一个类声明后,不能直接引用,必须经过 实例化: 基本类型声明后,直接开空间。 如: int a; a = 12; 非基本类型不直接开空间,而是开辟引用空间,数据空间没有开。只有通过实例化,才能给数据开辟空间。,2019/7/14,14,例: 1 Date today; 2 today = new Date( );,Today,2019/7/14,15,引用变量之间的赋值,1 Date a, b; 2 a=new Date( ); 3 b = a;,0xabcd,0xabcd,2019/7/14,16,内存管理原理,程序运行前:Java程序不负责创建内存空间,是由JVM完成。当程序准备执行时,由JVM向操作系统请求一定的内存空间,称为初始内存空间。程序执行过程中所需的内存都由Java虚拟机从这片内存空间中划分。,2019/7/14,17,程序运行前,2019/7/14,18,程序运行中,Java程序一直向Java虚拟机申请内存,当程序所需内存空间超出初始内存空间时,Java虚拟机会再次向操作系统申请更多的内存供程序使用。,2019/7/14,19,内存溢出,程序接着运行,当Java虚拟机已申请的内存达到了规定的最大内存空间,但程序还需要更多的内存,这时会出现内存溢出的错误。,2019/7/14,20,内存空间逻辑划分,JVM会把申请的内存从逻辑上划分为三个区域 方法区 堆 栈,2019/7/14,21,Java虚拟机对内存空间的管理,Java程序中的哪些内容会占用内存空间呢? 类的结构、 对象中的数据 变量(包括基本类型和引用类型)等都会占用内存空间,2019/7/14,22,Java虚拟机对内存空间的管理(续),Java虚拟机的三个区域“方法区”、“堆区”和“栈区”都有大小限制,任何一个区域内存溢出都会导致程序出现错误,栈内存溢出会发生StackOverflowException错误,堆内存溢出会发生OutOfMemoryError错误。,2019/7/14,23,方法区中的内存分配:方法区默认最大容量为64M,Java虚拟机会将加载的java类存入方法区,保存类的结构(属性与方法),类静态成员等内容。编写中小型程序时,一般不会造成方法区的内存溢出。,2019/7/14,24,类结构在方法区中的存放形式,2019/7/14,25,内存分配的策略,按照编译原理的观点,程序运行时的内存分配有三种策略 静态的 栈式的 堆式的,2019/7/14,26,静态的,静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间。 这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.,2019/7/14,27,栈式存储分配,栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的. 和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。,2019/7/14,28,静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.,2019/7/14,29,堆和栈的比较,堆主要用来存放对象的 栈主要是用来执行程序的 这种不同又主要是由于堆和栈的特点决定的,2019/7/14,30,堆的特点,堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C+中,要求创建一个对象时,只需用 new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致我们刚才所说的效率低的原因.,2019/7/14,31,栈的特点,在编程中,例如C/C+中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶 向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快, 当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个“大小多少“是在编译时确定的,不是在运行时. 栈有一个很重要的特殊性,就是存在栈中的数据可以共享,2019/7/14,32,栈存储举例1,例如:int a; a=10,声明变量的同时,系统给变量分配了内存空间,例如:MyDate today; today=new MyDate(),变量声明时只分配该变量的引用空间,实例化分配数据空间,2019/7/14,33,int a = 3; int b = 3; int a=4;,3,a,b,4,因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。,2019/7/14,34,栈存储举例2,Integer a=new Integer(3);/(1) Integer b=new Integer(3);/(2),a,栈,堆,a的实例化对象,b,b的实例化对象,2019/7/14,35,JVM中的堆和栈,JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。,2019/7/14,36,每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C+不同,Java中分配堆内存是自动初始化。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。,2019/7/14,37,堆中的内存分配:堆默认最大容量为64M,堆存放对象持有的数据,同时保持对原类的引用。可以简单的理解为对象属性的值保存在堆中,对象调用的方法保存在方法区。,2019/7/14,38,下面的代码实例化两个Student类的对象:,package com.wangwang; public class Demo public static void main(String args) int i = 10; Student stu1 = new Student(); = “Tom“; stu1.age = 18; Student stu2 = new Student(); = “Jerry“; stu2.age = 22; ,2019/7/14,39,2019/7/14,40,栈中的内存分配:栈默认最大容量为1M,在程序运行时,每当遇到方法调用时,Java虚拟机就会在栈中划分一块内存称为栈帧(Stack frame),栈帧中的内存供局部变量(包括基本类型与引用类型)使用,当方法调用结束后,Java虚拟机会收回此栈帧占用的内存。,2019/7/14,41,2019/7/14,42,变量,局部变量 类成员变量 方法参数 异常处理器(catch语句块)参数,member variable declarations public void aMethod(method parameters) ,class MyClass ,local variable declarations catch(exception handler parameters) ,2019/7/14,43,变量的初始化,类成员变量的初始化 系统自动进行 局部变量的初始化 使用前手工赋初值 例:见教材P48.ex3-4,2019/7/14,44,各种类型变量的初始值,2019/7/14,45,运算符与表达式,与C不同之处: Java是强类型语言,类型限制比C严格,运算 符的操作对象的类型会受到更多限制。 Java不提供指针运算符,增加了对象操作符 instanceof,字符串运算符+和零填充的右移等。,2019/7/14,46,算术运算操作符:+,-,*,/, %, +, - - 关系操作符:, =, , , & , |, (逐位异或), (按位取反) 逻辑操作符:&, |, !, (异或),&, | 赋值操作符:=, +=, -=, *=, /=, %=,&=, |=, =, =, = 其它操作符: ?: , , . , ( ),(type), new, instanceof,Java操作符类别,2019/7/14,47,赋值运算符与赋值表达式,赋值运算符“=” 例如:a1=3; 再看下面的语句: a1=a1+1; 则本语句执行后,a1的值将变为4。 有时还经常使用这样的语句: j = i = 3 ;,2019/7/14,48,算术运算符与算术表达式,1.算术运算符,算术运算符大多用于数学运算。如下表所示:,2019/7/14,49,例1:算术运算符在程序中的使用 public class MathOperator public static void main(String args) int a=13; / 声明int变量a,并赋值为13 int b=4; / 声明int变量b,并赋值为4 System.out.println(“a=“+a+“,b=“+b); / 输出a与b的值 System.out.println(“a+b=“+(a+b); / 输出a+b的值 System.out.println(“a-b=“+(a-b); / 输出a-b的值 System.out.println(“a*b=“+(a*b); / 输出a*b的值 System.out.println(“a/b=“+(a/b); / 输出a/b的值 System.out.println(“a/b=”+(float)(a/b); / 输出(float)a/b的实型数值 System.out.println(a+“%“+b+“=“+(a%b); / 输出a%b的值 System.out.println(b+“%“+a+“=“+(b%a); / 输出b%a的值 ,2019/7/14,50,2.递增和递减运算符,递增和递减运算符:“+”和“-”。 如果在程序中定义了变量i,在程序运行时想让它的值增1,可使用语句: i = i + 1 ; 等同与下面的语句: i+ ;,2019/7/14,51,例如对如下的语句块:,int i=3; System.out.println(i+); 此时的输出结果为3,待输出结束后,i才增值为4。 +i的执行原则则相反:是先增1,后引用。如对如下的语句块: int i=3; System.out.println(+i); 此时的输出结果为4,i先增值为4,然后输出结果。,2019/7/14,52,关系运算符与关系表达式,关系运算实际上是“比较运算”,将两个值进行比较,判断比较的结果是否符合给定的条件,Java的关系运算符都是二元运算符,由Java关系运算符组成的关系表达式的计算结果为布尔类型(即逻辑型),具体的关系运算符及其说明及执行原则如下表所示:,2019/7/14,53,逻辑运算符与逻辑表达式,逻辑运算符经常用来连接关系表达式,对关系表达式的值进行逻辑运算,因此逻辑运算符的运算对象必须是逻辑型数据,其逻辑表达式的运行结果也是逻辑型数据。Java的逻辑运算符有三种,具体表示与运算规则如表1与表2所示:,表1:逻辑运算符使用说明,表2:逻辑运算符运算规则,2019/7/14,54,逻辑表达式往往可用于表示比较复杂的条件,例如要判别某一年year是否是闰年,闰年的判别条件是:能被4整除但不能被100整除,或者能被400整除。 可以用一个逻辑表达式来表示: (year % 4= =0 ,2019/7/14,55,在Java中,运算符&和 | 的运算规则遵循一种在电工学中称为“短路”的执行方式,即对于逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的结果时,才执行该运算符。例如: a&b&c:如果a非真,则不再判别b和c,直接输出表达式的值为false;若a为真,则判别b,若b非真,则不再判别c,直接输出表达式的值为false;当a、b同时为真,才判别c的真假。 a|b|c:如果a为真,则不再判别b和c,直接输出表达式的值为true;若a非真,则判别b,若b为真,则不再判别c,直接输出表达式的值为true;当a、b同时非真,才判别c的真假。,2019/7/14,56,复合赋值运算符,复合赋值运算符是一种将算术运算符与赋值运算符相结合的一种运算符,这些运算符的说明及使用方式如下表所示:,2019/7/14,57,例3:复合赋值运算符在程序中的简单使用:,public class CompOperating public static void main(String args) int a=5,b=8; System.out.println(“Before calculate: a=“+a+“,b=“+b); a+=b; / 计算a+=b的值 System.out.println(“After += calculate: a=“+a+“,b=“+b); a-=b; / 计算a-=b的值 System.out.println(“After -= calculate: a=“+a+“,b=“+b); a*=b; / 计算a*=b的值 System.out.println(“After *= calculate: a=“+a+“,b=“+b); a/=b; / 计算a/=b的值 System.out.println(“After /= calculate: a=“+a+“,b=“+b); ,2019/7/14,58,其它运算符,1.位运算符,说明:对于位移运算符“”与“”则被成为逻辑无符号右移运算符,它只对位进行操作,而没有算术含义。,2019/7/14,59,右移操作符 和 , :带符号右移 1010 2 111010. :无符号右移,以0 填充 1010 2 001010 .,2019/7/14,60,2.条件运算符:?:,条件运算符是三元运算符,其使用的语法形式为: ? e1 : e2 其中表达式值的类型为逻辑型,若表达式的值为真,则返回e1的值;表达式值为非真,返回e2的值。 设有下列代码语句: int a = 3 , b = 6 , c ; c = (ab) ? 1 : 2 ; 则执行后c的值为2。,2019/7/14,61,运算符的优先级与结合性,Java语言规定了运算符的优先级与结合性。在表达式求值时,先按运算符的优先级别由高到低的次序执行,例如,算术运算符中采用“先乘除后加减”。如果在一个运算对象两侧的优先级别相同,则按规定的“结合方向”处理,称为运算符的“结合性”。Java规定了各种运算符的结合性,如算术运算符的结合方向为“自左至右”,即先左后右。Java中也有一些运算符的结合性是“自右至左”的。 例如:当 a = 3 ; b = 4 时 若 k = a 5 + b ,则 k = 2 (先计算a-5,再计算-2+b) 若 k = a + =b -= 2,则 k = 5(先计算b -= 2,再计算a + =2) 后面的表格列出了各个运算符优先级别的排列和其结合性,数字越小的表示优先级别越高,初学者在使用运算符时,请经常参考下列表格。,2019/7/14,62,2019/7/14,63,Java 强制类型转换,一般形式:(type) expression 例:(float)x/2 对强制类型转换的限制: 整型与浮点型可以相互转换,但基本类型 和数组、对象等复合类型之间不能互相转换。,2019/7/14,64,Java允许它的用户有限度地进行数据类型转换处理。转换的方式可分为“自动类型转换”和“强制类型转换”两种。 1.自动类型转换: 整型、实型和字符型数据需要进行混合运算时,首先需要把不同类型的数据转化为同一类型,然后才能进行运算。转换时,系统将按照数据类型的表示范围由小到大的转换原则自动进行。数据类型的表示范围由小到大的顺序依次为: 小 大 byte short char int long float double,2019/7/14,65,例5:自动类型转换示例 :,class TyChange public static void main(String args) int i=100; char c1=a; byte b=3; long l=567L; float f=1.89f; double d=2.1; int i1=i+c1; /char类型的变量c1自动转换为与i一致的int类型参加运算 long l1=l-i1; /int类型的变量i1自动转换为与l一致的long类型参加运算 float f1=b*f; /byte类型的变量b自动转换为与f一致的float类型参加运算 double d1=d+f1/i1; /*int类型的变量i1自动转换为与f1一致的float类型f1/i1计算结果为float类型.然后再转换为与d一致的double类型。*/ System.out.println(“i1=“+i1); System.out.println(“l1=“+l1); System.out.println(“f1=“+f1); System.out.println(“d1=“+d1); ,2019/7/14,66,2.强制类型转换,当表示范围大的数据类型要转换成表示范围小的数据类型时,需要用到强制类型转换,强制类型转换的语法形式为: (type) 例如: int m=3 ; byte b = ( byte ) m ; /把int型变量m强制转换为byte型 有时当两个整数相除时,系统会把这种运算归为整数类型的运算,因而会自动截去小数部分,使运算结果保持为整数。这显然不是预期的结果,因此想要得到运算的结果为实型数,就必须将两个整数中的一个(或两个)强制转换为实型,此时下面的三种写法均可行: (1)( float ) a / b /将整数a强制转换成实型数,再与整数b相除 (2)a / ( float ) b /将整数b强制转换成实型数,再被整数a除 (3)( float ) a / ( float ) b /将整数a与b同时强制转换成实型数 只要在变量前面加上欲转换的类型,运行时系统就会自动将这一行语句里的变量进行类型转换处理,但不会影响该变量原先定义的类型。,2019/7/14,67,例6:数据类型的强制转换 public class ChangeTest public static void main(String args) int a=155; int b=9; float c,d; System.out.println(“a=“+a+“,b=“+b); / 输出a、b的值 c=(float)a/b; / 将a除以b的结果放在c中 System.out.println(“a/b=“+c); / 输出c的值 d=a/b; / 将a除以b的结果放在d中 System.out.println(“a/b=“+d); / 输出d的值 ,2019/7/14,68,Java的结构化程序设计和程序流控制,结构化程序设计有三种基本程序流程结构: 顺序(sequence)结构 选择(selection)结构 循环(loop)结构。,2019/7/14,69,顺序结构及基本语句,顺序结构 系统默认自上而下一行一行地执行程序,这类程序的结构就称为顺序结构。 基本语句 1.赋值语句 2. 输入语句,开始,语句1,语句2,语句n,结束,2019/7/14,70,在Java中提供用户键盘输入环境的程序由以下(黑体字部分)语句固定组合而成: import java.io.*; public class 类名称 public static void main(String args) throws IOException BufferedReader buf; /定义buf为BufferedReader类的对象变量 String str; /定义str为string类型的变量 buf=new BufferedReader(new InputStreamReader(System.in); /初始化buf对象 str=buf.readLine(); /输入字符串至变量str存放 ,2019/7/14,71,例: 从键盘接收用户输入的字符串并输出该字符串。 程序如下: import java.io.*; / 装载java.io类库里的所有类 public class InputStr public static void main(String args) throws IOException BufferedReader buf; String str; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input a string:”); str=buf.readLine(); / 将输入的文字指定给字符串变量str存放 System.out.println(“string=”+str); / 输出字符串 ,2019/7/14,72,例:由键盘输入整数示例: 程序如下: import java.io.*; public class InputNum public static void main(String args) throws IOException int num; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input an integer:”); str=buf.readLine(); / 将输入的文字指定给字符串变量str存放 num=Integer.parseInt(str);/ 将str转成int类型后指定给num存放 System.out.println(“The integer is “+num); ,2019/7/14,73,在前面的程序中:num=Integer.parseInt(str) 是起数据转换作用的语句,将字符串转换为int型的数值。若是想转换成其他类型的数值,则可利用下表中的方法。,2019/7/14,74,选择结构,if语句 if语句是最简单的选择结构语句,格式如下: if 语句块 ,true,false,其中表达式的设置是很重要的,它返回逻辑(布尔)值,如果 true则进入部分的语句块处理。否则跳过该部分,执行下面的语句。如果语句块中只有一句语句,则左右大括号可以不写。If语句又称为单分支结构语句,它的执行流程如右上图所示:,2019/7/14,75,例:使用if语句判别两数是否相等: 程序如下: public class IfTest public static void main(String args) int a=3; int b=3; if (a= =b) System.out.println(“a equals b “); 该程序中表达式(a= =b)中的关系运算符“= =”不可以写成“=”。,2019/7/14,76,例:if 语句的重复使用:从键盘出入三个数,将其按从小到大的顺序输出。程序如下: import java.io.*; public class CompIf public static void main(String args) throws IOException int a,b,c,t; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input first number:“); str=buf.readLine(); a=Integer.parseInt(str); System.out.print(“Input second number:“); str=buf.readLine(); b=Integer.parseInt(str); System.out.print(“Input third number:“); str=buf.readLine(); c=Integer.parseInt(str); if (ab) t=a;a=b;b=t; if (ac) t=a;a=c;c=t; if (bc) t=b;b=c;c=t; /交换两个变量的值 System.out.print(a+“,“); System.out.print(b+“,“); System.out.print(c); ,2019/7/14,77,if-else语句 if-else语句的操作比if语句多了一步:如果表达式的值为假,则程序进入else部分的语句块(语句块2)处理。故它又被称为双分支结构语句。,flase,if-else语句语法格式为: if 语句块1 else 语句块2 ,2019/7/14,78,例:通过键盘输入两个整数,用if-else结构判别这两个数是否相等,并分别输出不同信息: 程序如下: import java.io.*; public class IfElseTest public static void main(String args) throws IOException int a,b; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input an integer:“); str=buf.readLine(); a=Integer.parseInt(str); / 将str转成int类型后指定给a存放 System.out.print(“Input another integer:“); str=buf.readLine(); / 再次调用方法接收键盘数据 b=Integer.parseInteger(str); / 将str转成int类型后指定给b存放 if (a= =b) System.out.println(“a equals b “); else System.out.println(“a doesnt equal b “); ,2019/7/14,79,例:输入一个年份,由程序判断该年是否为闰年。 程序如下: import java.io.*; public class JustLeapYear public static void main(String args) throws IOException int year; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.println(“Input the year:“); str=buf.readLine(); year=Integer.parseInt(str); if (year % 4 = 0 ,2019/7/14,80,if-else if 语句,if-else if语句用于处理多个分支的情况,因此又称多分支结构语句。其语法格式为: if 语句块1 else if 语句块2 else if 语句块n else 语句块n+1 ,true,true,true,false,false,false,2019/7/14,81,例:用if-elseif语句实现下面的符号函数:程序如下: import java.io.*; public class SignClass public static void main(String args) throws IOException double x ; int y; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input x is:“); str=buf.readLine(); x=Double.parseDouble(str); if (x0) y=1; else if (x= =0) y=0; else y=-1; System.out.print(“y=“+y); ,=,-,=,0,1,0,0,0,1,x,x,x,y,2019/7/14,82,if语句的嵌套 在if 语句中又包含一个或多个if语句称为if语句嵌套,这是程序设计中经常使用的技术。 例如现在有三个整数a、b、c,要判别它们能否构成三角形的三条边,则首先应判别这三个整数是否都大于零,然后才判别其任意两个数之和是否大于第三个数,其程序块为: if (a0) ,2019/7/14,83,switch语句 switch语句是Java支持的另一种多分支结构语句,使用switch语句进行程序设计,将使程序的结构更简练,表达更为清晰。Switch语句语法结构如下: switch case 数值1: 语句块1 break; case 数值2: 语句块2 break; case 数值n: 语句块n break; default: 语句块n+1 ,switch语句的流程图如上图所示。,2019/7/14,84,switch语句说明: switch后面的表达式只能返回如int、byte、short和char类型的值,多分支结构把表达式返回的值依次与每个case子句中的值相比较。如果遇到匹配的值,则执行该case后面的语句块; case子句中的数值I(I=1,2,n)必须是常量,且对应于执行不同操作的case子句中的数值I (I=1,2,n)应是不同的; default子句为可选。当表达式的值与任何case子句中的值都不匹配时,程序执行default后面的语句;当表达式的值与任何case子句中的值都不匹配且没有default子句,则程序将不执行任何操作,直接跳出switch语句。 break语句的作用是当执行完一个case分支后,终止switch结构的执行。因为case子句只是起到一个标号的作用,用来查找入口并从此处开始执行。如果没有break语句,当程序执行完匹配的case子句块后,还会执行后面的case子句块,这是不允许的。因此应该在每一个case分支后,用break语句终止后面的case分支语句块的执行。,2019/7/14,85,例:用switch语句处理表达式中的运算符,并输出运算结果: 程序如下: public class OperatorClass public static void main(String args ) int a=80,b=9; char oper=/; switch (oper) case +: / 输出a+b System.out.println(a+“+“+b+“=“+(a+b); break; case -: / 输出a-b System.out.println(a+“-“+b+“=“+(a-b); break; case *: / 输出a*b System.out.println(a+“*“+b+“=“+(a*b); break; case /: / 输出a/b System.out.println(a+“/“+b+“=“+(float)a/b); break; default: / 输出字符串 System.out.println(“Unknown operator!“); ,2019/7/14,86,例3:使用switch语句与if语句的程序:由键盘输入年份与月份,由程序判别输出该年的那个月有多少天。程序如下:,import java.io.*; class DayCounter public static void main(String arguments) throws IOException int year,month; String str; BufferedReader buf; buf=new BufferedReader(new InputStreamReader(System.in); System.out.print(“Input year number:“); str=buf.readLine(); year=Integer.parseInt(str); System.out.print(“Input the month number:“); str=buf.readLine(); month=Integer.parseInt(str); System.out.println(month + “/“ + year + “ has “ + countDays(month, year) + “ days.“); ,2019/7/14,87,static int countDays(int month, int year) int count = -1; switch (month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: count = 31; break; case 4: case 6: case 9: case 11: count = 30; break; case 2: if (year % 4 = 0 ,2019/7/14,88,循环结构,Java语言提供的循环结构语句包括: for语句、 while语句 do while语句。 作为一个循环结构来说,应该包含如下内容: 赋初值部分:用于设置循环控制的一些初始条件。 循环体部分:需要反复执行的代码(块),当然也可以是一句单一的语句。 循环控制变量增减方式部分:用于更改循环控制状况。 判断条件(也称循环终止条件)部分:是一个返回逻辑(布尔)值的表达式,用于判断是否满足循环终止条件,以便及时结束循环。,2019/7/14,89,for循环语句,for 循环语句的使用适应于明确知道重复执行次数的情况,其语句格式如下: for(赋初值;判断条件;循环控制变量增减方式) (循环体)语句块; for循环的执行流程如右图所示: 1 第一次进入for循环时,对循环控制变量赋初值。 2 根据判断条件的内容检查是否要继续执行循环,如果判断条件为真,继续执行循环,如条件为假,则结束循环执行下面的语句。 3 执行完循环体内的语句后,系统会根据循环控制变量增减方式,更改循环控制变量的值,再回到步骤2重新判断是否继续执行循环。,2019/7/14,90,例3:利用for循环语句计算从

温馨提示

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

评论

0/150

提交评论