第3章(类的方法).ppt

上传人:本田雅阁 文档编号:2254142 上传时间:2019-03-11 格式:PPT 页数:91 大小:442.51KB
返回 下载 相关 举报
第3章(类的方法).ppt_第1页
第1页 / 共91页
第3章(类的方法).ppt_第2页
第2页 / 共91页
第3章(类的方法).ppt_第3页
第3页 / 共91页
亲,该文档总共91页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3章(类的方法).ppt》由会员分享,可在线阅读,更多相关《第3章(类的方法).ppt(91页珍藏版)》请在三一文库上搜索。

1、第3章 类的方法,Page 2,目录,3.1 方法的控制流程 3.2 异常处理简介 3.3 方法的重载(overloading) 3.4 本章小结,Page 3,3.1 方法的控制流程,方法的控制流程 Java程序通过控制语句来控制方法的执行流程 Java中的流程控制结构主要有三种 顺序结构 选择结构 if语句(二路选择结构) switch语句(多路选择结构) 循环结构 for语句 while语句 do-while语句,Page 4,3.1.1 if选择结构,语法形式 只有if分支,没有else分支 if (boolean-expression) / statement1; if-else语句

2、 if (boolean-expression) / statement1 ; else / statement2 ; ,Page 5,if-else语句的特殊形式 if (boolean expression) /statement1; else if (boolean expression) /statement2; else if (boolean expression) /statement; else /statement; ,注意:else子句不能单独作为语句 使用,它必须和if配对使用。 else总是与离它最近的且尚未配对的 if匹配,可以通过使用 来改变匹配关系。,Page 6

3、,例3-1 计算每个月的天数(暂不考虑闰年) static int daysInMonth(int month) if (month = 2) return(28); else if (month=4)|(month=6)|(month=9)| (month=11) return(30); else return(31); ,Page 7,输入一个年份,判断它是不是闰年。 闰年: 能被4整除但不能被100整除,或者能被400整除。 import java.io.*; public class LeapTest public static void main(String args) throw

4、s IOException int year; boolean IsLeapYear; System.out.println(“Enter the year:“); BufferedReader in =new BufferedReader( new InputStreamReader(System.in); year=(new Integer(in.readLine( ).intValue( );,Page 8,IsLeapYear=(year%4=0 ,Page 9,输入两个整数比较大小 import java.io.*; public class ex3_2 public static

5、void main(String args) throws IOException int x, y; BufferedReader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(“Enter x and y:“); x=(new Integer(in.readLine( ).intValue( ); y=(new Integer(in.readLine( ).intValue( ); if (x!=y) if (xy) System.out.println(“xy“); else S

6、ystem.out.println(“xy“); else System.out.println(“x=y“); ,Page 10,以条件运算符代替if-else例子: if (ab) System.out.println(“The larger one is: “+a); else System.out.println(“The larger one is: “+b); 用条件运算符重写: System.out.println(“The larger one is: “ + (ab)?a:b);,Page 11,已知一个学生的分数,给出其分数等级。90-100分为级;80-89分为B级;70

7、-79分为级;60-69分为D级;0-59分为E级 public class IfElseDemo public static void main(String args) int testscore = 76; char grade; if (testscore = 90) grade = A; else if (testscore = 80) grade = B; else if (testscore = 70) grade = C; else if (testscore = 60) grade = D; else grade = F; System.out.println(“Grade

8、= “ + grade); ,Page 12,3.1.2 switch选择结构,switch语句是多分支的选择结构 switch (switch-expression) case value1: statements for case1; break; case value2: statements for case2; break; . case valueN: statements for caseN; break; default: statements for default case; break; 注意问题 switch-expression、常量值value1到valueN必须是

9、整型或字符型 如果表达式的值和某个case后面的值相同,则从该case之后开始执行,直到break语句为止 default是可有可无的,若没有一个常量与表达式的值相同,则从default之后开始执行,Page 13,if (i = 1) statementA; else if (i = 2) statementB; else if(i=3)|(i=4) statementC; else if (i = = 5) statementD; else statementF; ,switch (i) case 1: statementA;break; case 2: statementB;break;

10、 case 3: case 4: statementC;break; case 5: statementD;break; default: statementF; ,用switch代替if,Page 14,例3-2 使用switch结构计算每个月的天数 static int daysInMonth(int month) int days; switch(month) case 2: days = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days = 31; return(days); ,Pag

11、e 15,例3-3 用switch语句实现成绩分类的功能。 import static java.lang.Math; /静态引入 enum Grade A,B,C,D,E; /枚举类型定义 public class Grade public static char gradeLevel(double g) int n = (int)floor(g/10); /等价于(int)Math.floor(g/10); switch (n) case 10: case 9 : return Grade.A; case 8 : return Grade.B; case 7 : return Grade.

12、C; case 6 : return Grade.D; default: return Grade.E; ,Page 16,public static void main(String args) System.out.println(“gradeLevel(100)=“+gradeLevel(100); System.out.println(“gradeLevel(95.5)=“+gradeLevel(95.5); System.out.println(“gradeLevel(88)=“+gradeLevel(88); System.out.println(“gradeLevel(72)=“

13、+gradeLevel(72); System.out.println(“gradeLevel(68.5)=“+gradeLevel(68.5); System.out.println(“gradeLevel(60)=“+gradeLevel(60); System.out.println(“gradeLevel(59.5)=“+gradeLevel(59.5); System.out.println(“gradeLevel(35)=“+gradeLevel(35); ,Page 17,输入06之间的某一个整数,然后把它转换成星期 输出。(0对应星期日) import java.io.*; p

14、ublic class ex3_3 public static void main(String args)throws IOException int day; BufferedReader in =new BufferedReader( new InputStreamReader(System.in); day=(new Integer(in.readLine( ).intValue( );,Page 18,switch (day) case 0: System.out.println(“Sunday“); break; case 1: System.out.println(“Monday

15、“); break; case 2: System.out.println(“Tuesday“); break; case 3: System.out.println(“Wednesday“); break; case 4: System.out.println(“Thursday“); break; case 5: System.out.println(“Friday“); break; case 6: System.out.println(“Saturday“); break; default: System.out.println(“Day out of range“ ); break;

16、 ,Page 19,for循环结构 是Java三个循环语句中功能较强、使用较广泛的一个 for循环可以嵌套 一般语法格式如下 for (start-expression; check-expression; update-expression) /body of the loop; ,3.1.3 for循环结构,Page 20,解释 start-expression完成循环变量和其他变量的初始化工作 check-expression是返回布尔值的条件表达式,用于判断循环是否继续 update-expression用来修整循环变量,改变循环条件 三个表达式之间用分号隔开,Page 21,for语

17、句的执行过程 首先根据初始表达式start-expression,完成必要的初始化工作;再判断表达式check-expression的值,若为真,则执行循环体 执行完循环体后再返回表达式update-expression,计算并修改循环条件,这样一轮循环就结束了 第二轮循环从计算并判断表达式check-expression开始,若表达式的值仍为真,则循环继续,否则跳出整个for语句执行for循环下面的句子,Page 22,例3-4 打印九九乘数表 public class MultiTable public static void main(String args) for (int i=1;

18、 i=9;i+) for (int j=1; j=i;j+) System.out.print(“ “+i+“*“+j+“=“+i*j); System.out.println( ); ,Page 23,增强for循环(JDK5.0之后),增强for循环的功能:用来对数组或集合对象进行遍历。 语法格式: for(Type name: Array/Set) /循环体 ,Page 24,例3-5 使用增强for循环打印星期一到星期日的英文名。 public class PrintDay public static void main(String args) String days=“Monday

19、“, “Tuesday“, “Wednesday“, “Thursday“, “Friday“, “Saturday“, “Sunday“; for(String day:days) System.out.print(day+ “ “); System.out.println( ); ,Page 25,输入一个整数,输出它所有的因数 import java.io.*; public class ex3_7 public static void main(String args) throws IOException int n, k; BufferedReader in =new Buffer

20、edReader(new InputStreamReader(System.in); System.out.println(“Enter a positive integer: “); n=(new Integer(in.readLine( ).intValue( ); System.out.print(“Number “+n+“ Factors “); for (k=1; k = n; k+) if (n % k = 0) System.out.print(k + “ “); System.out.println( ); ,Page 26,逗号运算符 可用在 for 循环控制表达式的初始化和

21、递增两部分。在这两部分中可以存在多个由逗号分隔的语句,这些语句会被依次计算。 public class ex3_8 public static void main(String args) for(int i = 1, j = i + 10; i 5; i+, j = i * 2) System.out.println(“i= “ + i + “ j= “ + j); ,Page 27,while语句 实现“当型”循环,其一般语法格式如下: while (check-expression) /body of the loop; 条件表达式(check-expression)的返回值为布尔型 循

22、环体可以是单个语句,也可以是复合语句块 执行过程 先判断check-expression的值,为真则执行循环体 循环体执行完后再无条件转向条件表达式做计算与判断;当计算出条件表达式的值为假时,跳过循环体执行while语句后面的语句。若为真,则继续执行循环 特点:它的循环体可能一次也不被执行,3.1.4 while循环结构,Page 28,循环接受并输出从键盘输入的字符,直到输入的字符为回车为止 char ch=a; while (ch!=n) System.out.println(ch); ch= (char)System.in.read( ) ; / 接收键盘输入 ,Page 29,计算数列

23、1,2,10 的和。 public class ex3_4 public static void main(String args) int i=1, sum=0; while(i=10) sum+=i; i+; System.out.println(“sum=“+sum); ,Page 30,例3-6 计算存款收益:假设银行中存款10000元,按11.25%的利率,一年后连本带利将变为11125元。你若将此款继续存入银行,试问多长时间就会连本带利翻一番。 import java.text.*; public class CalProfit public static void main(St

24、ring args) double original, money, interest; int years = 0; original = money= 10000; interest = 11.25 / 100; System.out.println(“yeart money“);,Page 31,while (money 2 * original) years = years + 1; money = money + (interest * money); System.out.printf(“%dt%.2fn“ ,years,money); /end of while System.o

25、ut.println( ); System.out.printf(“第%d 年存款额达到 %.2f元“, years, money); /end of main /end of class,Page 32,do-while语句 实现“直到型”循环 一般语法结构如下 do /body of the loop; while (check-expression); 其使用与while语句很类似,不同的是它首先无条件的执行一遍循环体,再来判断条件表达式的值,若表达式的值为真,则再运行循环体,否则跳出do-while循环,执行下面的语句 特点:它的循环体至少要执行一次,3.1.5 do-while循环结

26、构,Page 33,/ while(i=10) sum+=i; i+; System.out.println (“sum=“+sum);,/ do sum+=i; i+; while(i=10); System.out.println (“sum=“+sum);,比较这两段程序,Page 34,输入一个整数,然后输出它的翻转形式 import java.io.*; public class ex3_5 public static void main(String args)throws IOException int n, right_digit, newnum = 0; BufferedRe

27、ader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(“Enter the number: “); n=(new Integer(in.readLine( ).intValue( ); System.out.print(“The number in reverse order is“); do right_digit = n % 10; System.out.print(right_digit); n /= 10; while (n != 0); ,Page 35,功能 跳出循环,不

28、再执行剩余部分。 有两种使用格式: (1)不带标号的break语句; (2)带标号的break语句 适用场合 在switch 结构中,用来终止switch语句的执行。 在循环结构中,不带标号的break语句用于终止break语句所在的最内层循环;带标号的break语句将跳出标号所标识的循环。 也可用在代码块中,用于跳出它所指定的块。,3.1.6 break语句,Page 36,例3-7 简单break应用举例 public class BreakTest public static void main( String args ) String output = “; int i; for (

29、 i = 1; i = 10; i+ ) if ( i = 5 ) break; output += i + “ “; output += “nBroke out of loop at i = “ + i; System.out.println(output); ,Page 37,例3-8 在嵌套循环中使用break语句:使用下面的程序来实现例3-4的九九乘法表。 public class Ex3_6 public static void main(String args) for (int i=1; i i) break; /跳出内循环 System.out.print(“ “+i+“*“+

30、j+“=“+i*j); System.out.println( ); ,Page 38,例3-9 break与label一同使用举例 public class Ex3_7 public static void main(String args) outer: for (int i=1; i i) break; /跳出内循环 if (i= =6) break outer; /跳出outer标识的循环 System.out.print(“ “+i+“*“+j+“=“+i*j); System.out.println( ); ,Page 39,continue语句 必须用于循环结构中 停止本次迭代,

31、回到循环起始处,开始下一次迭代过程 有两种使用格式 不带标号的continue语句 终止当前这一轮的循环,跳出本轮循环剩余的语句,直接进入当前循环的下一轮。 带标号的continue语句 使程序的流程直接转入标号标明的循环层次。,3.1.7 continue语句,Page 40,不带标号的continue语句 在while或do-while循环中,会使流程直接跳转至条件表达式 在for循环中,会使流程跳转至表达式update-expression,计算并修改循环变量后再判断循环条件,Page 41,例3-10 简单的continue语句举例 public class ContinueTest

32、public static void main( String args ) String output = “; int i; for ( i = 1; i = 10; i+ ) if ( i = 5 ) continue; output += i + “ “; output += “nUsing continue to skip printing 5“; output += “ni = “ + i; System.out.println(output); ,Page 42,例3-11 打印2到9之间的偶数的平方,但是不包括偶数6的平方 public class Ex3_9 public s

33、tatic void main (String args) for (int i=2; i=9; i+=2) if (i= =6) continue; System.out.println(i*i); ,Page 43,带标号的continue语句 格式: continue label; /label为标号名称 标号label应该定义在程序中某一循环语句前面,用来标志这个循环结构,Page 44,例3-12 九九乘法表也可用下面的程序来实现 public class Ex3_10 public static void main (String args) outer: for (int i=1

34、; i10; i+) inner: for (int j=1; j10; j+) if (ij) System.out.println( ); continue outer; System.out.print(“ “+i+“*“+j+“=“+i*j); ,当执行到满足条件ij时,跳出inner循环,直接跳到outer循环,计算并修改i的值,进行下一轮的循环。,Page 45,异常处理 在进行程序设计时,错误的产生是不可避免的。所谓错误,是在程序运行过程中发生的异常事件,这些事件的发生将阻止程序的正常运行。 如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复? 为了加强程序的鲁棒性,Ja

35、va语言具有特定的运行错误处理机制。,3.2 异常处理简介,Page 46,3.2.1 异常处理的意义,1. 异常(Exception)的基本概念 异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制。 是面向对象规范的一部分,是异常类的对象。 Java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了 该运行错误的信息 处理错误的方法 每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。,Page 47,2. Java处理错误的方法 抛出(throw)异常 在方法的

36、运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常。 捕获(catch)异常 运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止。,Page 48,探测抛出异常,捕获处理异常,调用,图3-1 异常处理示意图,Page 49,Java异常处理机制的优点 将错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误的捕获和处理 克服了传统方法的错误信息有限的问题 把错误传播给调用堆栈,Page 50,3.2.2 错误的分类,错误 程序中的错误可分为三种类型:编译错误、

37、运行错误、逻辑错误。 编译错误是编译器能够检测到的错误,一般为语法错误; 运行错误是运行时产生的错误,如被零除、 数组下标越界等; 逻辑错误是机器本身无法检测的,需要人对运行结果及程序逻辑进行认真分析,逻辑错误有时会导致运行错误。,Page 51,根据错误的严重程度不同,可分为两类 错误 致命性的,用户程序无法处理 Error类是所有错误类的父类 异常 非致命性的,可编制程序捕获和处理 Exception类是所有异常类的父类,Page 52,再对异常进行分类 非检查型异常 不能期望程序捕获的异常(如数组越界,除零等) 继承自RuntimeException 在方法中不需要声明,编译器也不进行检

38、查 检查型异常 其他类型的异常 如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个父类),对此编译器要进行检查,Page 53,异常类和错误类的层次结构,Page 54,Java预定义的一些常见异常 ArithmeticException 整数除法中除数为0 NullPointerException 访问的对象还没有实例化 NegativeArraySizeException 创建数组时元素个数是负数 ArrayIndexOutOfBoundsException 访问数组元素时,数组下标越界 ArrayStoreException 程序试图向数组中

39、存取错误类型的数据 FileNotFoundException 试图存取一个并不存在的文件 IOException 通常的I/O错误,Page 55,例3-11 测试系统定义的运行异常数组越界出现的异常。 import java.io.*; public class HelloWorld public static void main (String args ) int i = 0; String greetings = “Hello world!“, “No, I mean it!“, “HELLO WORLD!“; while (i 4) System.out.println (gree

40、tingsi); i+; ,Page 56,3.2.3 异常的处理,对于检查型异常,Java强迫程序必须进行处理。处理方法有两种: (1) 声明抛出异常 不在当前方法内处理异常,而是把异常抛出到调用方法中 (2) 捕获异常 使用try catch( ) 块,捕获到所发生的异常,并进行相应的处理,Page 57,1. 声明抛出异常 如果程序员不想在当前方法内处理异常,可以使用throws子句声明将异常抛出到调用方法中。 如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关的错误信息,并终止程序的运行。在异常被抛出的过程中, 任何方法都可以捕获它并进行相应的处理。,Page 58,pu

41、blic void openThisFile(String fileName) throws java.io.FileNotFoundException /code for method public void getCustomerInfo( ) throws java.io.FileNotFoundException / do something this.openThisFile(“customer.txt“); / do something 如果在openThisFile中抛出了FileNotfoundException异常,getCustomerInfo将停止执行,并将此异常传送给它

42、的调用者。,Page 59,2. 捕获异常:try、catch和finally语句 语法格式: try /此处为抛出具体异常的代码 catch (ExceptionType1 e) /抛出ExceptionType1异常时要执行的代码 catch (ExceptionType2 e) /抛出ExceptionType2异常时要执行的代码 catch (ExceptionTypek name) /抛出ExceptionTypek异常时要执行的代码 finally /必须执行的代码,但finally子句不是必需的 ,Page 60,说明 try 语句 其后跟随可能产生异常的代码块 catch语句

43、其后跟随异常处理语句,通常用到两个方法: getMessage( ) 返回一个字符串对发生的异常进行描述。 printStackTrace( ) 给出方法的调用序列,一直到异常的产生位置。 finally语句 不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源。 注意事项 在类层次树中,一般的异常类型放在后面,特殊的放在前面。,Page 61,例3-12 读入两个整数,第一个数除以第二个数,之后输出。 import java.io.*; public class ExceptionTester public static void mai

44、n(String args) System.out.println(“Enter the first number:“); int number1 = Keyboard.getInteger( ); System.out.println(“Enter the second number:“); int number2 = Keyboard.getInteger( ); System.out.print(number1 + “ / “ + number2 + “=“); int result = number1 / number2; System.out.println(result); ,Pa

45、ge 62,其中,Keyboard类的声明如下: import java.io.*; public class Keyboard static BufferedReader inputStream = new BufferedReader (new InputStreamReader (System.in); public static int getInteger( ) try return (Integer.valueOf(inputStream.readLine( ).trim( ) .intValue( ); catch (Exception e) e.printStackTrace(

46、 ); return 0; ,Page 63,public static String getString( ) try return (inputStream.readLine( ); catch (IOException e) return “0“; ,Page 64,例3-13 捕获 NumberFormatException类型的异常。 import java.io.*; public class ExceptionTester2 public static void main(String args) int number1=0, number2=0; try System.out.

47、println(“Enter the first number:“); number1 = Integer.valueOf(Keyboard.getString( ).intValue( ); System.out.println(“Enter the second number:“); number2 = Integer.valueOf(Keyboard.getString( ).intValue( );,Page 65, catch (NumberFormatException e) System.out.println(“Those were not proper integers! I quit!“); System.exit(-1); /退出程序 System.out.print(number1 + “ / “ + number2 + “=“); int result = number1 / number2; System.out.println(result)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1