java课程2013内容串讲b.ppt_第1页
java课程2013内容串讲b.ppt_第2页
java课程2013内容串讲b.ppt_第3页
java课程2013内容串讲b.ppt_第4页
java课程2013内容串讲b.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1,java课程内容串讲 2013末,复习串讲基本内容 澄清某些模糊认识 更正若干错误判断,2,Chapter01 计算机系统概述,熟悉java编译的过程: 源文件(文件名.java) 目标文件(文件名.class) 通过JVM/解释器 运行 了解: 运行java程序的基本过程(在Eclipse环境下) Types of Errors: Syntax, Run-Time, Logic error.(了解) 文件名.class为后缀名的文件是什么?在什么阶段产生的?是可直接硬件运行的二进制可执行文件吗? (此处是byte code, 而只有.com和.exe是在PC上可直接运行的二进制可执行文件,其他的需要另外单独转换) 如果一个系统想运行Java程序,必须安装JDK吗? Eclipse是开发Java语言必需的软件工具吗? Syntax Rules for Identifiers (见下页或原先课件),3,Chapter01 计算机系统概述,java的内存管理过程: java运行环境(JRE)或虚拟机(VM)能够自动完成常规的内存管理. Java程序运行时并不由操作系统(如Windows)进行直接内存管理。,4,Chapter02 数据与表达式,原型/基本/原生类型: (变量分为原型类型和类类型) 一般数据类型强调: 小写开头 (只是习惯. 又例如: 变量Can11是否合法?) 包装类: 大写 (java规定) 自己写的类: 大写(只是习惯) 例如: Boolean类型和boolean类型的区别、 Int的写法和int类型、Character与char类型的区别。 Java中的简单(基本)数据类型一般是指原型类型 赋值语句与表达式: 赋值的含义, 原型类型赋值与类类型变量赋值的区别 标识符的命名规则: 1.字母和下划线_开头, 含字母,数字,下划线; 2.不能用关键字; 3.$可以开头或在标识符内,但慎用. 4.符号”-”开头可以吗? 5。eclipse是保留字吗?6. 符号“&”可以吗? Java区分大小写: 例如: Return是关键字吗? 可做变量吗?,5,原型类型讨论: 原型类型占用的内存字节数量, 其变量的取值范围? 例如: long、double、byte、char和short等类型各占用多少内存? 取值范围? Java默认的小数及整数类型是什么? 专用赋值运算符:a +=b;a +=b-;含义? 简单输入与输出: 语句System.out.println(eggsPerBasket + “ eggs per basket.”)中“+”号的含义? 两字符串有“-”号的用法吗? System.out.println( “ a=“ + a ); System.out.println( a+b+ “a=”+(a-b); 注意运算优先级 System.out.println( “ a=“ + a + b); 数字常量: 八进制、十六进制、e记数法的正确写法(了解) 赋值兼容性问题: 隐式转换规则: 类型强转: int i=2.0 有问题, 必须添加强转指令(int) int a=a;合法。 Long a =1000; 是否合法?(N)(掌握自动包装的概念),6,算术运算符: + - * / % + - 等等 表达式内部生成值类型一般先转为较复杂类型 例如: int x=12, y=5 则 x/y=?, (x+10)/y=? 例如:System.out.println(5%-3)结果?(符号只是分子的) 例如: int x=2; double y=4; x+y结果的类型? x/y? x/+y? 总结:一个长表达式的最后结果一般是最复杂类型,但顺序不同其结果可能会不一样。 括号和运算符优先级规则 (见附录D) String类字符串变量, 连接(+)操作和其他String方法 熟悉常用的String方法:length(), toLowCase(), equals(), substring(), replace(), charAt(), toCharArray(), indexof()等等. 注意不同用法:字符串变量.length(), 而数组名.length a.toLowCase( ).substring(1,4)的含义? (了解),7,键盘和屏幕 I/O-println和print 转义字符的含义与使用: System.out.println( “ this is an apple“ ); System.out.println( “ this is at apple“ ); System.out.println( “ this is a apple“ );,8,字符串对象的两种生成形式 String name1= new String(“James Gosling”); String name1= “James Gosling”; 问题: 如何比较两个字符串的长度?是用什么方法? 是.length()方法还是 .equals()方法? 他们分别能做什么? 注意:在equals( )方法定义中,只有接受Object类型的形参,才会在适用范围上没有局限。(不限于字符串) 问题: String name= new String100; 执行后各元素的内容是什么? 掌握String类型变量执行方法后的内容不变性。 了解基本类库和标准类库中各种包(见下页解释)的导入方法。(import 语句的用途) 知道包装类的各种基本名称、方法的使用及转换。 自动包装的概念:Int x=180;() 而Double d=3;(X) Byte x=253; ? 包装类一般有静态方法可用,而简单变量呢?(了解),Chapter03 使用类和对象,9,了解随机数生成器对象的创建和使用。 知道Math类的各种方法的基本用法。 了解格式化输出的类的基本用法。,Chapter03 使用类和对象,10,Chapter04 定义类与方法(编写类),类与方法:类中的变量有两种: 实例变量: 跟着对象走, 不同对象有不同副本(要引用实例变量的话,必须标明是哪个对象的) 实例变量在创建对象时由java初始化. 举例:int型实例变量x在创建对象时被java初始化为0. 静态变量: 跟着类定义走, 只有一个副本 静态变量: 其值也是由java初始化(定义时). 方法: 分类: 有返回值方法(用return语句返回) 注意: 一般不能出现返回值和方法头不一致的情况 和无返回值 (方法头修饰符: void, 或称为空方法) 调用方法: 静态方法: 通过类名 ( 例如: Math.sqrt(33); ) 非静态方法: 通过对象名,int mm(int l) return 99.99,只可以隐式转换,return什么?变量?类名?,11,方法中的参数:(形参不能用public、static等修饰) 原型类型-传值 对象-传址 调用方法时形参和实参类型不匹配时, java可以进行自动类型转换. (转换顺序是java默认的规则) A方法调用一个具有返回值的B方法时,A必须用赋值语句,将B方法的返回值赋予A的某个变量吗?(N) 方法中声明的变量-局部变量 局部变量-只在方法体内有效, java不自动给予初始化,使用时必须由程序员来进行初始化. 块中声明的变量也是局部变量 信息隐藏和封装-修饰符: this, public, private this: 表示当前的对象 问题: 在main方法中是否可以有this.n出现? (假设n为静态变量) (N) public: 对实例变量和方法的使用没有限制(可以在类的定义体外使用),只能修饰实例变量和静态变量,12,private: 对实例变量类定义体之外不能直接引用该变量. 对方法类定义体之外不能调用该方法 protected修饰符的基本属性是什么? (了解) 比如对属性的使用范围的限制!子类是否可用?其他的类能否使用?(该修饰符的作用介于public和private之间),13,对象和引用: 类类型变量和原型变量的比较: 原型变量包含该变量的“值” 对象(类类型变量)只能存放该对象在内存中的首地址 类类型变量在方法中作为参数: 类类型变量作为参数出现时也是“传值”, 而因为对象存储的是内存块首地址, 所以其最终传递了“传址”. (实参把“首地址”传给了形参) 例如:数组名做方法参数时,与引用类型变量(类类型变量)做参数的实质相同。 注意类类型变量中=和= =的使用 信息隐藏和封装的基本思想是什么? 什么样的做法算是信息隐藏, 封装? (例如通过方法来访问各种实例变量(简单变量及对象), 各种修饰符的采用等等),14,掌握构造方法的写法及若干规定 构造方法与一般方法的不同之处: 构造方法与类名相同 Note that a constructor has no return type specified in the method header, not even void (构造方法没有返回类型的说明) 问题:本想写一个构造方法,但加上void修饰符,那之后的含义? 构造方法可以不写。Java则提供默认的。 书写一个类时可以自己不写构造方法。 问题: 构造方法可以重载吗?构造方法可调用本类其他方法吗? 一个构造方法如何调用本类其他构造写法?this(参数表).,15,Chapter05/06 条件和循环语句,条件运算符的含义:y=(num1num2) ? num1:num2); 分支语句 if .else 布尔表达式: 注意=号的含义, 以及各种比较符号(=等) Java复合布尔表达式逻辑运算符号 (|, &等) 若score为double类型,则if(score = 90)结果? 字符串比较: equals方法 (比较两串的字典顺序) 多分支if else及switch语句(break语句在这里的含义, 缺省该语句的情况怎么办? 例如:循环内部含switch语句,而switch内有的缺省有的不缺省,每次循环执行switch时都不走同一路线,怎么办?) Switch语句的控制表达式的结果的内容要求 (什么类型? 4种) 循环语句 while, do-while, for break, continue, exit等语句的含义与用法 例: 在多重循环中执行break结果是什么?是跳出所有循环的层次吗? 又例:执行continue的结果是跳出本次循环而重新开始吗? 在循环语句中执行return的结果是什么? 注意while()语句括号中的值为布尔变量, 为true或false.,16,continue 的基本意思:结束本次循环,跳到哪里? break 的基本意思:跳出循环体(单重?多重的情况呢) return 的基本意思:跳出所有循环,返回上级方法或系统。 布尔表达式及布尔变量 常用符号及运算优先级规则(见附录D) 布尔表达式的基本含义(到底用来干什么? ) 讨论: 例如: int a=10,b=10,c=10; if(a+b)|(ac)System.out.println(“kkkkkk”); 结果? (答案: 能够打印”kkkkkk”) 讨论: 例如: int a = 5, b = -5, c = 20; if (c - 30) | (b- -5) & (a+ 5) 结果?各个变量值? (答案: 结果为“true”,且a=5,b=-5,c=19) 迭代器的概念:仅做参考,17,本章复习题目: 基本概念题(如上页-可做选择题目) 使用上述控制流语句等编写程序: 写出循环体的执行结果。 问题:找出一个数据区域中满足某种条件的数据。(熟练使用/, %等算术运算符) 数制的提取和运算(例如:寻找1000到1800之间的个位与十位之和为某个固定值的所有的数) 问题:如何计算得到其个位和十位等各个数位的值? 数列的阶乘 例如: 1/n!-根据精度要求求出n的值 综合一点的计算题目: 例如: 1+1/2!-1/4!+1/6!+(-1)n+1*1/(2n)! (涉及方法(带参数)的调用等),18,单纯编写程序题目: 问题1:水仙花数指三位数中每个数字的立方和与自身相等的数字。 例如: 数字370, 满足3*3*3+7*7*7+0*0*0=370. 试输出所有的水仙花数。 for(int i=100;i1000;i+) int a=i%10; int b=(i/10)%10; int c=i%100; if(a*a*a+b*b*b+c*c*c=i) system.out.println(i); 问题2:某些两位整数,该数的平方的最后两位还是该整数,求出所有两位数中有此种特征的整数。 加上换行控制语句如何写? 自己找题目练习,也可参考当时课堂练习,19,涉及循环概念的单纯的阅读程序题目(掌握) 问题:for循环或while循环内部:含switch语句等, default的位置出现在case之前,如何执行? 此时的break语句的跳出范围?,20,Chapter07 面向对象设计,方法的调用: 类名/对象名.方法名 this.方法名 (当要调用的方法在同一个类中时, this可以省略) 静态方法 修饰符: static 静态方法可以不需要任何类型的对象而直接调用(类名.方法名) 静态方法不能调用类中的实例变量 (即使是在main方法中也不行, 要调用的话必须创建对象, 并指明是哪个对象的实例变量) (问题: 在main方法中是否可以有this.n出现? (假设n为静态实例变量) ) (N) 静态方法不能调用类中的非静态方法, 除非创建对象 静态方法可以调用静态方法 (同类方法可以互相调用) 非静态方法可以调用静态方法 (java的合理规定) 。,21,静态变量 修饰符: static 静态变量只有一个副本, 即使所在的类已经创建多个对象也是如此. (静态变量如果不设初值,则在定义时即由java自动赋予初始值,在方法中可以直接使用之) 静态方法可以调用静态变量。 注意:static 只能用来修饰类里的实例变量而不能用来修饰方法里的局部变量 回顾:Math类, Integer类及其他包装类的基本意义 Math类的标准数学方法(图5.9) 包装类的基本含义和用途 重载 在同一个类中拥有一个以上相同名称的方法定义, 称为方法名称重载 当方法名称被调用时, java根据参数的数量、类型、次序来判定应该使用哪个定义 方法调用时的参数可以进行自动类型转换(转换原则是隐式的由低到高原则),但要慎用,因为有时会引起混乱. 无法根据返回值的类型来实现重载!(什么意思? 搞明白!),22,构造函数及编写时的约定: 构造函数是在 (利用new) 创建对象时所调用的一种方法, 一般用来初始化对象中的实例变量 程序员没有编写任何构造函数(没有显式定义), java将自动提供默认的构造函数 程序员一旦自己编写构造函数, java不再自动提供任何默认的构造函数 程序员一旦自己编写构造函数, 则必须自己写出一个默认的构造函数, 否则一旦使用默认函数时java将报错 . 构造函数中可以使用/调用该类定义中的其他方法. 使用new 语句创建对象时,自动调用构造函数(若构造函数有println语句,则在屏幕上会有输出内容) 用new语句创建一个子类对象时,怎样创建父类对象?(答:首先创建父类对象,要么显式的写出来,要么系统首先自动创建(调用默认super()创建父类对象) 构造方法的作用域标识符必须是public吗? 构造方法的形参个数有限制吗?,23,包的使用(进一步说明)(了解) 定义在同一个包(package)内的类可以不经过import而直接相互使用。 使用import语句指明要引用的源程序的路径, 主要是指明程序中要使用的类和包。 而不是要引用该包的全部源程序. 也不是直接拷贝过来 同一个包中的各个类,其类名可以相同吗? (了解),24,Packages (包的概念) (仅了解),起因: 目前编写程序时, 一个类一个文件, 以后的大程序可能有很多文件(类), 放在同一个文件夹里面查找很麻烦,也可能用到别人写的文件(类)集合, 于是有重名的问题等等 举例: 自己的文件放在 d:/work/software/test01文件夹中, 别人的放在 d:/work/software/test02文件夹中. 要是使用别人的文件或类, 需要: 在对方的类中声明 package test02 在自己的类的声明 import test02.* 或import test02.文件名 类路径基目录: d:/work/software (基本的目录层次) 当前目录: 是包的名称. 包: 是分组到同一个目录中的许多类的集合,25,掌握接口的基本含义(掌握) 接口的继承使用extends. 接口可以继承吗?是单继承还是多继承?(单继承) 一个类可以实现多个接口吗?(Y) Java的接口只能有抽象方法吗?(N)(还可以有属性) 了解Comparable接口, Iterator接口等基本含义。 了解枚举类型,26,Chapter08 数 组,创建数组格式: Base_Type Array_Name = new Base_TypeLength; 数组下标从0开始 数组的可选的初始化方法(可以声明时用花括号, 也可以用程序) 可选的数组初始化方法 (掌握数组的正确的定义方法) Object oob=new int 8,9,10; int a=(int)oob; float s=new int10; X(错误性质:让编译器自动将一个整型数组转换成为一个浮点型数组,而java编译器无此能力) 问题:int a=a,10,123 合法吗?(Y) 数组对象的实例变量-length的使用: for(i=0;im.length;i+),27,Chapter08 数 组,知道数组在类与方法中的应用 数组可以当实例变量 数组元素当方法参数 数组名当方法参数 方法可以返回数组名,28,main方法的参数(命令行式的参数传递)(了解) 方法main采用String类型的数组作为参数: public static void main(String args) 举例: 命令行: Java TestProgram Josephine Student 则args数组的赋值? 简单问题:命令行参数是字符串类型吗? 此处void 可以是别的吗? 类里面可以有Main()方法吗? 注意: 数组作为对象, 使用=和=时如同对一般对象 多维数组的基本定义方法 (会定义) 了解:循环语句处理数组的基本技巧 使用循环语句处理数组很合适: 一重for循环可以处理一维数组, 二重for循环可处理二维数组 例如:二维数组元素的有条件填充、读取和处理变换等,29,数组的排序(sort array of numbers in the ascending or descending order ) -掌握 掌握:课件中的方法(一个方法内解决): public void seletionSort( int a ) 问题:若数组a是对象数组,而按照每个对象的某种特征或某方法运行结果排序的话,有如何做呢? 了解:本书中带接口的较通用的写法。(仅了解) 数组的查找(search method) -了解 掌握:课件中的方法(一个方法内解决): public int binarySearch(int number,int searchValue) 折半查找见其他教材和参考书的解法。 递归式的解法。 基本了解:本书中带接口的较通用的写法。,30,Java中, 多维数组是利用一维数组实现的 多维数组的每一维是对前一维的划分,如:二维数组的第二维是对第一维的进一步划分 问题:int b = new int3;合法? 含义:二维数组中,每行的长度不是必须相同 二维数组的length属性的含义? 问题:int b = new int3;合法?,31,Chapter09 继 承,继承的概念: 继承允许我们先定义一个很通用的类(基类), 然后通过添加细节定义出较专用的类(派生类) 派生类对基类的继承性(包括实例变量和方法). 派生类的添加性(也包括实例变量和方法). 继承实际上经常性的包含了方法的覆盖,覆盖解决了子类和父类之间的重名问题。 派生类的构造函数 Use super to invoke a constructor in parent class 一般用来初始化哪里的实例变量? 合理的派生类构造函数应该怎样初始化各个实例变量? 怎么样初始化基类的实例变量, 怎么样初始化派生类自己的实例变量? Use super to invoke a common method in base class(使用super可调用基类的一个普通方法,或者一个被派生类覆盖的方法) Use this to invoke a constructor within the class 争议的问题:派生类继承父类的构造函数吗?(No !),32,掌握:super的使用问题: 如果在子类构造方法中使用super()关键字,必须放在开始之处吗?此时的super()做什么? 创建子类的对象时,实际是首先运行子类自身的构造方法吗? 子类不使用super关键字调用父类的构造方法时会是什么情况呢? 注意事项(掌握) super指向父类对象,仅在子类的方法中调用父类方法时使用。 但是在一个类的静态方法(如main方法)中,不能够使用super关键字调用父类的方法。因为super的使用隐含一个匿名对象.,33,覆盖: 在派生类中, 若一个方法定义与基类中已有的某个方法拥有同样的名称, 参数数目及类型, 则称为覆盖 覆盖的过程:创建派生类对象后, 调用被覆盖的方法时, 调用的是派生类自己的方法 例如:原教材图7.13(画字符图形的程序) (了解呵呵) Triangle top = new Triangle(indent, topWidth); Box base = new Box(indent + (topWidth/2) - (bottomWidth/2), bottomHeight, bottomWidth) top.drawAt(1); base.drawAt(0); 注意:方法drawAt()是基类方法而不是子类方法,该方法里面要执行方法drawHere( ),而这个方法在基类和子类都存在,那么在执行上述top.drawAt(1)方法时执行的是哪一个drawHere( ) ? ( 答案: 因为top是派生类对象,所以仍然执行派生类的方法drawHere( ) ) 假设top是Figure类型,若将其指向子类,那又怎样?,Figure: 图形,Box 矩形,Triangle三角形,34,注意: 定义覆盖方法的时候, 不能修改方法的返回类型. 例如方法名及参数相同, 但方法头分别是int和double返回值的两个覆盖方法的定义, 编译器会报错. (结论:无法单纯根据返回值的类型来实现覆盖!) final 的含义: 修饰属性:该属性不能使用程序语句来改变。(定义时一般赋初值,可视作常量) 修饰方法: 该方法不能在子类中被覆盖。 修饰类名: 该类不能被继承。 问题:final可以修饰什么?能禁止本类之内的重载吗?(N) static和final同时修饰一个属性时,必须赋初值吗? (N) 派生类的类型 派生类对象属于所有的祖先类型, 故能拥有多个类型 左边祖先类对象=右边派生类对象 /合法 举例: Person p1=new person(); Student s1=new student(); 则语句:p1=s1; /valid 而语句:s1=p1; /invalid,35,Object类-所有类的祖先. (那么,它是接口的祖先吗?) Object类的含义、用途等。(该类中equals(),toString()等方法的原意?) Object类是异常类的祖先吗?(Y) 举例:Object x ; x=“abc”; /合法: 左边祖先类对象=右边派生类对象 问题:tostring ( )方法继承自Object,能否在子类中定义方法如tostring(int a,int b)?。(Y) 抽象(abstract)方法和抽象类 抽象方法: 某些方法并不打算实际应用,仅仅打算有派生类覆盖, 且有派生类的对象调用.则可以声明为抽象方法. 那么,抽象方法仅包含什么?不包含什么? 抽象类: 若类中至少有一个抽象方法, 则该类必须声明为抽象类 (反过来问:抽象类可以不包含抽象方法吗?(Y)) 问题0:抽象类的构造方法(构造器)写不写?怎么写? 问题1:abstract类中是否可以有别的非abstract方法? 问题2:abstract方法在其子类中是否必须被实现? 问题3:abstract可以修饰什么? 问题4:abstract修饰的类有祖先类吗?是Object的子类吗?,36,Dynamic Binding与Polymorphism variable的提法: 各种文献解释有侧重, 但无论如何都是指在运行时间(run time)确定最终运行的程序实体和对象可具有多个类型.,37,动态绑定举例:在运行时才确定最终跳转地址的现象称为动态绑定(动态覆盖技术) (掌握 !) class Z void f(int x) void f(double x) class P extends Z void f(int x) void f(double x) void f(long x) public class TestOverride public static void main(String args) Z t = new P(); t.f(10); t.f(10L); t.f(2.5); 注意上述例题的类型隐式转换问题, 若不能隐式转换则由java报错,变量类型决定能调用的方法(根据自身定义),对象决定使用哪个方法(根据现在的指向),38,实际程序设计问题(最全面的情况,得知道,结合12年考试题) 设计和完善一个抽象类 / 普通类时:构造方法都写什么? 派生类如何初始化父类的各种属性 / 实例变量? 能够完成子类的构造方法。 以上三个问题其实是一个,得根据main方法中创建对象的需要来设计基类(哪怕此时是一个抽象类)和派生类。 构造方法一般只写一个。 能够在子类内部实现父类的抽象方法。 数据集合(数组)的各个元素分别指向不同的子类对象时,该数据集合如何定义?(见右下图) Figure s=new Figure10; Figure 0 = new Box(2, 20); 。,Figure: 图形,Box 矩形,Triangle三角形,39,实际程序设计问题(一般情况)(掌握) 设计和完善一个父类(抽象类 / 普通类)的某些方法如get()等。 派生类的设计:如何初始化父类的各种属性 / 实例变量? 能够完成子类的构造方法。(带参,不带参的) 构造方法一般只写一个或两个。 子类除了构造方法外,还能够实现父类的抽象方法。 对类类型组成的集合(如数组)进行某种操作。,40,弄清多态和动态绑定的概念。 对象可以有多种类型的具体化: 左边祖先类对象=右边派生类对象 实际的问题:如果使用父类的引用指向子类的对象,那么可以直接使用此引用调用子类的所有方法吗?(N) 仅了解:利用接口实现多态性 基本问题:java中一个类是否可以实现多个接口? java中一个类是否可以同时继承一个类和实现其他接口?一个接口是否可以继承自另外一个接口? 基本问题: java的单继承有什么好处?(其中:无论是一般类还是抽象类,都是单继承!) 排序:掌握课件的“一个方法内解决问题”。的写法 或课本中:listing9.9的写法。 查找:了解折半查找的各种实现方法的写法。,Chapter10 多态性,41,关于书写程序:必须掌握书写一个类的基本写法:,问题: 有一个不完整的基类,能否填写一个基类的set()和get()方法?(可以完成对所有实例变量的“set”,包括简单类型和类类型) 有一个不完整的派生类(下页右图Box),能否根据语义填写该类的方法 (必要的构造方法和其他方法?) 假设有一个Personnel类(员工)的数组s(Personnel s) , 其元素包含了正式工, 临时工, 钟点工 等派生类型的对象, 试写一排序程序, 使s中的所有员工档案按工龄长短 重新排列顺序. (掌握 !) public void sort(Personnel s) (基本思路是什么?),Personnel: 员工,正式工,临时工,钟点工,42,意义:通用性-顺延的命题-数组中对象的排序问题 假设有一个Figure类的数组s(Figure s) , 其元素包含了Box, Triangle, Circle, 等类型的对象, 试写一排序程序, 使s中的所有形状按周长(round) 大小进行某种顺序排列. (掌握) public void sort(Figure s) (那么,其基本思路是什么?)(掌握),Figure: 图形,Box 矩形,Triangle三角形,43,Chapter11 异 常 处 理,Java中的异常处理语法: try-throw-catch 掌握java异常处理的流程 注意: catch语句块只应用于紧贴其前的try语句块 注意: 异常是一个对象, 而Exception类是所有异常类的根类, 是最通用的异常类. 可以自己定义异常类 异常的声明和转移 当本方法只抛出异常但又不处理, 则必须在方法头用throws语句(非throw)进行声明, 让上级方法来捕获处理. 编写异常处理程序时, 特殊异常处理在先, 一般异常处理在后, 否则? 异常的分类: Exception类是通用异常类, 而ArithmeticException异常是变量做分母时其值为0而产生的算术运算异常,而IOException是输入输出(例如文件操作)时的异常, 还有FileNotFoundException等等 .,44,注意:忽视(ignore)异常处理的结果是什么? 若java程序声明了异常, 但整个程序忽略了处理, 也没有抛给java系统, 则编译报错! (文件处理时经常遇到。) 说明1: try-throw-catch 结构中的throw语句的用法 课本的示例程序是人为设计的, 用了throw语句, 实际程序中可能只有try-catch结构, 此时若在try语句块中出现异常, 一样被java抛出并被catch语句块捕获并处理 finally语句块的执行原则: 只要进了try-catch-finally Block, 即使没有异常, 也执行finally-block 在try-catch-finally Block, 有异常并捕获, 执行finally-block 在try-catch-finally Block, 有异常没有被捕获, 也执行finally-block 通过练习增进对finally语句块的理解 参见习题课中关于异常的练习题(三次习题课其中的第3次),45,finally语句块的执行示例 (掌握!) void mm() throws SomeException try if(条件) throw new SomeException(); 。 return 表达式; catch ( AnotherException e) . finally System.out.println(“finally”); 问题1: 若满足if中的条件,抛出SomeException异常,则执行顺序?不出现该异常时的执行次序? 问题2: 若if未满足,只执行return语句,那么执行顺序?若本句有异常,且被就地扑捉,则顺序? 问题3: 若return语句出现在catch语句块的最后, 假设异常被捕捉,那么其执行次序是什么?,46,问题4: int number = Integer.parseInt(scoreindex+);会产生说明类型的异常? 格式错误;越界错误。 问题5:异常被捕捉,则finally板块之后的return语句如何执行?(正常执行返回!),47,关于所有不可检测异常(都来自RuntimeException类及其子类)的说明: (掌握) 不可检测异常可以不捕捉(不用trycatch结构),不声明(不用throws语句来声明 ) 问题1:是否可定义一RuntimeException类的子类?(Y) 问题2:即使在方法调用时没有自己抛出异常,则是否可在方法中用throws语句来声明和标识异常? (Y)(即:定义了方法可能抛出的异常,不意味着一定抛出异常) 问题3:catch和finally段中的语句,是否允许再次出现异常?(Y)(甚至可以再出现try catch结构) 简单问题: 创建异常对象(带有表示提示信息的参数)然后抛出,捕捉后怎样显示该异常对象的信息?(用什么方法?) 抛出异常意味着有运行错误吗? try关键字可以单独使用吗?(N)(try或与catch关键字或与finally关键字一起使用),48,异常的习题练习(掌握) 熟悉各种基本的异常类的类型。 研究习题课中的范例及其本课件提出的若干问题。 自己寻找相应题目联系。,49,Chapter11+ 流与文件I/O (了解),概念: 流是一种对象, 用于数据流动,它可以把数据输出到目标, 也可以从数据源输入或读取数据 输入流, 输出流的概念 Text File I/O: (了解文本文件的输出) PrintWriter outFile = new PrintWriter(new BufferedWriter (new FileWriter (“test.dat“); 总的含义: 打开文件“test.dat“准备输出. 输出到文本文件: outFile.println(); 关闭文本文件:outFile.close(); 注意异常: FileNotFoundException,50,了解:文本文件的输入(listing 5.11) 了解:文本文件的输出(主要掌握第十章的Listing10.7) 注意: 不会单独考察文件操作, 一般结合其他的计算问题, 例如从键盘读入数据并计算, 或把计算及处理结果写入文件, 等等. 参见习题课中关于文本文件的练习题 一般性问题: (掌握文件操作的基本原理) File类能对文件进行读写操作吗?是基本类吗? 文本文件和二进制文件,读到文件末尾分别会有什么不同? Java可以把文本文件当成一般二进制文件进行操作吗?,51,Chapter12 递 归 (掌握!),递归的基本概念. 递归: 方法定义中包含对自己的调用. 递归方法中的一个语句块(选择)应该不调用本身, 而应该是直接结果. 而每次调用本身必须“smaller version of itself” ,这样才可能达到中止条件 能够写不太复杂的递归方法. 先写出递归调用主体 再写出递归的停止情况 通常有if-else语句 参照、掌握课堂讲解的内容. (当时的习题课练习等) 深入分析递归过程,完全掌握课堂讲解的内容, 达到习题课上对递归问题写作方法的要求, 能将以前章节的某些算法改写成递归算法。 (可以自己寻找一些题目进行练 习) 问题1:递归调用可以放在return语句中来实现。 问题2:递归放置在多重循环中时,就执行很多次。,52,Chapter12 递 归 (掌握!),递归的应用. 注意:所有的Java递归程序,都可以使用循环等非递归程序等价实现。 举例: private static int tot = 1; public static int num(int mm) if 条件 XXXX; else tot=XXXXXX; num(mm); (假设此处在if-else结构里面) return tot; (假设此处在if-else结构之外) 问题:当上述方法被调用时,返回的tot的值?(返回多次,但最后的值是唯一一个),53,Chapter13 集合 (掌握 !),13.XX 链表 看懂结点类(10.4 ListNode)和链表类(10.5StringLinkedList)以及(10.8LinkedListDemo)的基本定义及含义,掌握链表类程序(10.11StringLinkedListWithIterator)的主要方法。 掌握链表类中各种基本方法的实现 length() addANodeToStart(String addData) deleteHeadNode( ) Find(String target) showList() 等方法的具体写法 . 思考:对已经存在的链表执行某种操作(例如: (1)读出链表数据进行排序. (2)遍历链表, 依次将符合条件的节点数据存入一个数据结构或文本文件等. (3)在无序的旧链表基础上建立一个有序的新链表. (3)针对已有有序链表,改为反序或反顺序输出结点数据内容等) 内部类和迭代器-知道课堂简介,54,接上页: “链表内容存入文本文件”的基本思路?(基本了解)(回答同学提问,仅做了解!) 主要参考第十章的listing10.7的结构 步骤: 1. 创建输出流对象, 打开文本文件 (可使用trycatch结构捕捉异常)(捕捉异常的结构见邮件中TextFileOutputDemo.java) 2. position=head; 用遍历的方法找出每一个data . 用 “流对象.println()”方法写入文件. 3. 最后关闭文件等. 遍历链表,将某些内容存入其他数据结构呢?(了解!),55,(掌握)推荐链表类程序: StringLinkedListWithIterator.java 含有内部类,因此各个方法都重写,涉及实例变量的使用方式。 插入一个节点不再仅是一种方法,本程序提供了两种节点插入方法:(1)在链表的第一个节点之前插入新节点; (2)在某个节点后面插入新的节点。 问题:链表已有序,如何在链表中某个特定节点后面插入新节点? 含有迭代器式的处理模式:例如在方法length()里面有 “position = position.link;” 语句。 删除节点也新的更切合实际的方法设计: deleteCurrentNode( )-删除当前节点;如何删除的?具体思路是什么? 问题:如何在链表中某个特征节点后面删除新节点?,实际问题有很多变化:掌握! 同时注意研究该程序(StringLinkedListWithIterator.java)的其他方法。很多方法也是基本方法,实际编程时要求有很多变化。例如:在具有某个数据特征的节点后面插入节点,或发现两个特有的节点并交换其数值。 有时除了head之外,还要定义ListNode类型的其他变量,例如previous或current等。 注意写一个方法时的边界条件:空链表,只有一个节点,或没有找到某个特征节点的情况等等。,56,57,问 题 答 疑 注: 本解答并非与考题有直接关系, 只是根据学生提问整理而成,(1): 数组定义: int a =new int15; int a=new int15; 哪个正确? 答: 都可以. 编译器将接受上述两种表示方法. (2): 基类方法为public int a(int x, int y); 派生类方法为int a(int x, int y); 可以这样覆盖吗? 答: 不可以. 方法覆盖时必须修饰符完全一致 这种写法实际上是缩小了方法的使用权限(在目前学习阶段没有缩小权限,但在使用包的情况下权限将缩小) (3):基类方法为public int a(int x, int y); 派生类方法为public void a(int x, int y); 可以这样实现 覆盖方法吗? 答: 不可以. 编译将报错,因为这既不是方法的重载(译文版教材: 无法根据返回值的类型来实现重载), 也不是方法的覆盖(方法名之前的修饰符要完全一致, 方法名之后的参数数目, 类型要完全一样 ),58,(4): 若在派生类中自己编写缺省构造函数, 而在里面又只初始化了部分的实例变量, 那么另外的实例变量的值是否还被自动初始化? 答: 现在版本的java仍将对缺省构造函数中未能涉及到的实例变量进行初始化。 例如:某个类PetRecord有三个实例

温馨提示

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

最新文档

评论

0/150

提交评论