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