第一篇:java程序设计教案
《Java程序设计》
授 课 人:授课班级:电子商务专业
授
课
教
案
第一章
Java语言简介
教学目的要求
了解Java的基本特点和用途 掌握如何下载Java SDK软件包 了解设置Java程序的开发环境SDK 如何运行Java程序 了解Java的概貌 主要内容
Java语言的发展历程; Java语言的特点; Java语言的开发工具;
Java应用程序和小程序; Java程序的注释方法; 写Java程序的风格规范。
重点内容
Java语言的特点; Java语言的开发工具;
Java应用程序和小程序;
难点内容
无
课时分配
1课时 教学方法
讲授法、演示法、对比法 讲授内容提要
1.1
Java语言的发展简介
1991年Sun Mircosystem 公司成立了一个Green项目开发小组,Jame Gosling 为组长; 设计Java 采用虚拟机代码(Virtual Machine Code),即.class文件,它通过解释器运行 ; 1995年5月Sun Mircosystem 公司对外正式发布Java1.0;
Java2 用途:适用于各种应用开发,尤其是网络应用,网络服务和嵌入式系统。1.2
Java语言的特点 1.简单性 2.面向对象 3.网络适用性 4.健壮性 5.安全性
6.平台无关性 7.可移植性 8.解释型 9.高性能 10.多线程 11.动态性 12.丰富的类库 13.嵌入浏览器运行
1.3
Java类库的概念 1.4
网络浏览器 1.5
Java开发工具
NetBeans: 这个集成环境可以方便地进行程序的编辑、编译、生成和运行。J2sdk :
http:// java.sun.com免费下载;Visual J++ 6.0 / 8.0: VJ++还吸收了VB集成开发环境IDE的特征,是一个强有力的Java程序开发工具。Jcreator
Eclipse(MyEclipse)等
1.6
Java程序的分类 基于控制台的应用程序;
基于浏览器运行的小程序applet。
小程序与应用程序的区别是:小程序必须依赖一个HTML文件和支持Java的网络浏览器。老师演示小程序和applet程序
应用程序举例(程序1-1): public class hello {
public static void main(String args[ ]){
System.out.println(“Hello Java!”);
} }
小程序举例(程序1-2):
import java.awt.Graphics;
// 注意该行的含义 import java.applet.Applet;public class sayhello extends Applet {
public void paint(Graphics g){
g.drawString(“Hello Java!”,35,30);
} }
小程序对应的HTML文件:
1.7
1.8 对Java程序的解释
编写Java程序的风格要求 课堂练习:
请编写一个应用程序输出你自己的学号和姓名 课外练习(作业): 下载并安装J2SDK; 设置系统环境变量 下载并安装MyEclipse 熟悉MyEclipse的开发环境
第2章
数据类型、运算符和表达式
教学目的要求
掌握字符常量和符号表示的常量的概念和应用 掌握整形、浮点型、字符型和布尔型变量的概念和应用 掌握数据的概念 理解参数传递方式
学会逻辑运算符、算术运算符和位运算符的使用方法
主要内容
常量:包括字面常量和符号表示的常量; 变量:整形、浮点型、字符型和布尔型; 数组:Java的数组属于类类型; 参数传递方式;
运算符:包括逻辑运算符、算术运算符和位运算符等;
重点内容
整形、浮点型、字符型和布尔型变量的概念和应用; 符常量和符号表示的常量的概念和应用
难点内容
参数传递方式
课时分配
2课时 教学方法
讲授法、演示法、对比法、实验验证法 讲授内容提要
2.1
常量
整形常量:采用八进制、十进制、十六进制表示,但不能采用二进制表示,和C/C++中的一样。
浮点常量:采用十进制或科学记数法表示。在缺省情况下一个浮点数是double型。布尔常量:true和false,它们不是数,不能进行算术运算。字符常量:与C/C++中的表示类似
。字符串常量:Java中字符串常量是对象。
2.2
变量
变量的命名原则是:以字母(’a’„’z’和 ’A’„’Z’)、下划线(‘_’)和‘$’符号开头的,由字母、数字(’0’„’9’)、下划线和‘$’构成的一个符号序列。
例如,a,_a,NameOfStudent,$10均是合法变量名,而-a和9a是非法变量名。关键字不能用作变量名(见表2-1)注意:Java对变量是区分大小写.2.2.1
整形类型的变量 字节(byte)型,8个位。
短整形(short),占16个位。整形(int),占32个位。
长整形(long int),占64个位。
Java中的整形最值均有符号。例如程序2-1测试最值:
public class Test_Int {
// 程序2-1 测试整形变量的最值
public static void main(String [ ] args){
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
} }
注意: byte、short、int、long是原子类型,而Byte、Short、Integer和Long分别是四种原子类型对应的类类型。
2.2.2
字符类型变量
Java字符量的长度为16个位,表示范围是从‘u0000’ 到 ‘uffff’ 即从0 到 65535; Character是char类型对应的类类型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3
浮点类型变量 分类:float和double。
Float、Double 是对应的类类型 ;
Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和
Float.NEGATIVE_INFINITY是正/负无限大。2.2.4
布尔类型变量
boolean变量取值:true和false ;
true和false不能转换成任何数值表示,true不是1,false也不是0。
2.2.5
原子类型变量的生存空间
一个变量的生存空间是由两个大括号决定的 范围。下列写法在C/C++中是正确的,但在Java中是错误的(注意)。{
int x=1;{ int x=0;// 错误 } }
2.3
变量赋值问题
如果类中定义的原子类型变量,未给出初值,那么它们将有缺省值 :byte、short、int 和long变量的缺省值是0;char、float、double和boolean变量的缺省值分别是’u0’、0.0f、0.0d和false。
方法内定义的局部变量,应当对其赋值,否则无法通过编译。例如: // 程序2-4 class Test {
// 定义一个类
int Value;// 类中的变量未赋值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){
int x=100;
// 必须赋值,否则无法通过编译
Test obj=new Test();// 对象赋值
System.out.println(obj.Value +“
”+x);
} } 2.4
数组
Java数组是系统定义类Array 的子类; 数组的分类同C/C++:一维和多维。
2.4.1
一维数组
定义数组的格式 :int a[ ] ; 或
int[ ] a ;其值是null ;
在定义数组时不能指定大小。a仅是一个引用,代表一个数组名,但没有对应的空间。产生数组空间的方法有两种 :
在定义时直接赋值:int a[ ]={1,2,3};
通过new分配空间: int a[ ]=new int[10];public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b= a;
for(int i=0;i<3;i++)b[ i ]++;
for(int i=0;i<3;i++)System.out.println(a[i]);
} }
public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b = new int[6];
System.out.println(“b数组长度 = ” + b.length);
for(int i=0;i System.out.print(b[i]+“ ”); } } 注意:(1)获得数组元素的个数:数组名.length; (2)一个整形数组若仅仅采用new分配空间,而没有对其赋值,那么每个元素的值是0 注意:Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制 2.5 Java中的参数传递方式 Java的参数传递的形式有两种:基本类型按值传递,对象类型按引用传递; 通过return语句从方法中返回时,基本类型总是以值的方式返回,而对象总是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras { static test fun(test o,int y){ o.x=20; } } y=1; return o;public static void main(String [ ] args){ test obj1 , obj2;int Val = 3;obj1=new test();obj1.x=100; obj2=fun(obj1,Val); System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val); } 2.6 Java的运算符 主要包括: 算术运算符、关系运算符、逻辑运算符、位运算符和三元条件运算符。2.6.1 算术运算符 算术运算符:+、-、*、/、%、++和--,与C/C++基本相同。 %运算符不但可以对整形数据运算,而且可以对浮点型数据运算。例如:3.14 % 2.5的值约等于0.64 ; 隠式数据类型转换: 当整型与浮点型数据进行混合运算时,表达式中的数据类型会进行相应的自动转换,规则为:byte->short->int->long->float->double。 这种转换规则也适应于赋值语句,当赋值符左右两侧变量类型不一致时,只要转换过程中不丢失数据,便进行自动转换。 class number { int x;} public class relationalOperator{ public static void main(String args[ ]){ } number n1,n2; n1=new number(); n2=new number();n1.x=1; n2.x=1;if(n1.x==n2.x) System.out.println(“对象的数据成员x相等!”); if(n1==n2) System.out.println(“n1和n2是一个对象!”);else System.out.println(“n1和n2不是一个对象!”);} 2.6.2 关系运算符 关系运算符不能同其它类型的变量一同 参与运算,例如假设a,b,c是三个整形的变量,那么 a=b==c 是 正确 OR 错误? ; 关系运算符用于对象时,是判别两个引用是否代表同一个对象。而不是判断两个引用所指向的对象是否同属一个类。 2.6.3 逻辑运算符 逻辑运算符有&&、|| 和!,分别是与、或和非。运算结果是true或false; 逻辑运算有求值“短路”现象,例如程序2-11 : public class shortCut { static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1));return x < 1;} static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2));return x < 2; } public static void main(String [ ] args){ } if(testOne(6)&& testTwo(1))System.out.println(“表达式为真”);else System.out.println(“表达式为假”); } 2.6.4 位运算符 位运算符:&、|、^、~、<<、>>,分别称为位与、或、异或、左移、右移; Java引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。例如: int a=-2 , b; b=a>>>30;2.6.5 三元条件运算符 语法格式:(exp)?(exp1):(exp2); Java要求:(exp1)与(exp2)必须同类型。2.6.6 “+”运算符 Java对“+”进行了重载,可以将任何类型的对象(包含原子类型)转化为String类型。例如: int x=1;char ch='A';double d=9.8;System.out.println(“Result: ”+x+ch+9.8);课堂练习: 课外练习(作业): P32 3、4、6题。 第3章 控制语句 教学目的要求 了解Java程序的结构,学习使用各种语句结构来控制程序的流程,完成程序的功能任务。 主要内容 Java的分支语句; 循环控制语句; break和continue语句; 带标号的break和continue语句。 重点内容 Java的分支语句; 循环控制语句; break和continue语句; 难点内容 循环控制语句; break和continue语句; 课时分配 3课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 3.1 分支语句 if-else语句; switch-case语句。 3.1.1 if 语句 if语句的语法格式 同C/C++; 条件表达式必须是布尔类型,例如: 下面的写法在C/C++中是合法的,但在Java中却是非法的 : int i=10;if(i) ...程序3-1描述了用applet从文本框获取数据,然后将比较的结果显示出来。 // 程序 3-1 import java.awt.*;import java.applet.*; public class compareNumbers extends Applet{ Label lab1,lab2;TextField input1,input2; int num1,num2;public void init(){ lab1=new Label(“输入第1个整数”); input1=new TextField(10); lab2=new Label(“输入第2个整数”);input2=new TextField(10); add(lab1); add(input1);add(lab2);add(input2);} public boolean action(Event e , Object o){ } if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText()); num2=Integer.parseInt(input2.getText()); if(num1 switch 语句 switch语句的语法结构 同C/C++; switch后面的表达式类型必须是字符类型或整形 ; case后面的常量不能重复 ; 程序3-3采用小程序实现将学生的百分制成绩转换为优、良,中、及格和不通过五个等级: // 程序3-3 import java.awt.*;import java.applet.*; public class scoreConvert extends Applet{ Label prompt; TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“输入成绩”); } public void paint(Graphics g){ g.drawString(“各等级的人数:”,25,40);g.drawString(“优秀 : ”+Excellent,25,55);g.drawString(“良好 : ”+Good,25,70);g.drawString(“中等 : ”+Middle,25,85);g.drawString(“及格 : ”+Pass,25,100);g.drawString(“不通过: ”+Failure,25,115);input=new TextField(2);add(prompt);add(input);} public boolean action(Event e , Object o){ int score=Integer.parseInt(input.getText()); showStatus(“"); input.setText(”“); switch(score/10){ case 10: case 9: Excellent++; break;case 8: Good++; break;case 7: Middle++; break;case 6: Pass++; break;case 5: case 4: case 3: case 2: case 1: case 0: Failure++; break;default: showStatus(”输入有误,重新输入!“); } repaint(); return true;} } 程序3-3需要注意的地方 在action()方法中调用的repaint()方法,是一个系统方法,它具有自动调用paint()方法的能力,从而实现对网页的刷新。3.2 循环控制语句 Java中的循环控制语句有三种,分别是:while,do-while和for语句;循环体内的语句会反复执行,直到控制布尔表达式的值变为false为止。3.2.1 while语句 while语句格式: while(Boolean-Expression) StatementS 程序示例3-4 略 3.2.2 do-while语句 do-while语句的语法格式如下: do{ Statement }while(Boolean-Expression); 程序3-5 如下: // 产生一个大于0.9的随机数为止 public class GenerateDoubleNumbers { public static void main(String args[ ]){ } double d;do{ d=Math.random();System.out.println(d); }while(d<0.9);} 3.2.3 for语句 for语句语法格式如下: for(ForInitopt;Boolean-Expression;ForUpdateopt) Statement // 程序3-6输出一个*三角形 public class printGraphics extends Applet{ public void paint(Graphics g){ int xpos,ypos=0; for(int row=6;row>=1;row--){ xpos=25;ypos+=15; } for(int column=1;column<=row;column++){ } g.drawString(”*“,xpos,ypos);xpos+=7; } } 3.3 break语句和continue语句 3.3.1 不带标号的break语句和continue语句 break语句可以跳出包含它的最内层的循环,不再执行剩余的语句; continue语句停止执行当前的循环,回到循环处,开始执行下一轮的循环。这些特性和C/C++的功能一样。for(int i=1;i<10;i++) { if(i%3==0) continue; else System.out.println(”i = “+i); } for(int i=1;i<10;i++) { if(i%3==0) break; else System.out.println(”i = “+i); } 课堂练习: 1、仔细分析下面程序,写出程序的最终运行结果。public class s_switch { public static void main(String args[]) { int ch=8; int r=10; switch(ch-1){ case 7: r=r+3; case 8: r=r+5; case 9: r=r+6;break; default:; } System.out.println(”r=“+r); } } 2、随机产生26个英文字母a~z,直到大于u为止。用while和for语句实现。 课外练习(作业): P44 1—4 第4章 Java的类 教学目的要求 理解面向对象编程的基本概念 了解类的封装方法 如何创建类和对象 了解成员变量和成员方法的特性 学习使用OOP方式进行程序设计 深刻理解类的继承性和多态性 主要内容 类的定义和使用; 方法的定义和使用; 实例变量和局部变量; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承; 抽象方法和抽象类; 对象类型转换; 访问权限限制符:public、private、protected。 重点内容 类的定义和使用; 方法的定义和使用; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承; 抽象方法和抽象类; 对象类型转换; 难点内容 构造方法; 方法的覆盖和重载; 继承的概念和应用; 组合与继承; 抽象方法和抽象类 课时分配 8课时 教学方法 讲授法、演示法、对比法、实验验证法、学生讨论法 讲授内容提要 4.1 类与对象 在Java程序中,除原子类型的变量以外都是对象,连Java程序本身也不例外。 类是面向对象程序设计的基础,OO始终是围绕着对象的封装性、继承性和多态性展开讨论的。 4.1.1 类与对象的区别 类是一个抽象的概念,对象是一个具体的概念。 类是在一组对象的基础上,通过抽象和概括获得的一个概念。 对象是由数据和方法紧密结合的一个封装体,具有信息隐藏的能力。 对象可以通过方法(函数)与其它对象进行通信,但并不知道这些方法的实现细节。4.1.2 Java和C编程思想的区别 C是结构化的编程语言,以函数为编程单元,程序员把注意力集中在编写函数上。Java是面向对象的编程语言,以类为编程单元,程序员的精力集中在对类的设计上。 对象将实例变量(instance variable)和对数据的操作(即方法)约束在一起,类似一个独立的程序,易于扩充,易于维护,代码可复用。 4.1.3 如何定义类 类是对象的模板,它定义了对象的结构和操作数据的方法。public class Sayhello extends Applet { public void paint(Graphics g){ int xPos=35; int yPos=30; g.drawString(”Hello Java!“,xPos,yPos); } } 定义类的通用格式如下: class className extends superClassName{ type instance-vairbale1;return-type methodName1(parameter-list){ method-body;} } public class Hello { public static void main(String args[ ]){ System.out.println(”Hello Java!“); } } 系统类Object是整个类层次结构中的根。 如果我们要定义Object的子类,可以不指明extends Object,默认情况下一个类就是Object类的子类。 类内定义的变量称为实例变量,函数称为方法; Java将类的定义和类的实现放在一起,便于系统维护。例如: class point { // Object类的子类 int x , y; void init(int a, int b){ int i=0; x=a; y=b; } } 4.1.4 对象和引用 对象是客观存在的变量,对象的引用就是对象的名字,例如:Point p1;创建对象:p1=new Point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。例如: class Point { // 程序4-1 int x , y; void init(int a, int b){ x=a; y=b; } } public class TwoPoint{ public static void main(String [ ]args){ Point p1= new Point(), p2= new Point(); p1.x=10;p2.x=30;p1.y=20;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y); } } 4.2 方法 方法是一个功能模块,类似C中的函数; 方法和实例变量都必须定义在类内,方法是类的功能接口 ; 定义方法的原则:方法应当只执行单一的任务,并且方法名能有效地表达该任务; 方法的返回值类型、方法名和参数表共同称之为方法的特征。调用方法的格式:引用.方法名(参数表);例如: Point p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//仅对p1对象的x和y进行赋值 p2.init(30,40);//仅对p2对象的x和y进行赋值 对象是客观存在的变量,对象的引用就是对象的名字,例如:point p1;创建对象:p1=new point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。 4.3 实例变量和局部变量 class Loc { // 程序4-2 int x=1;// 实例变量 void printLocVar(){ int x=25;// 局部变量 } System.out.println(”n x is :“+x); ++x; System.out.println(” x is :“+x); void printInstanceVar(){ System.out.println(”n x is :“+x); x*=10; System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主类 public static void main(String args[ ]){ System.out.println(“ x is :”+x); obj.printLocVar(); obj.printInstanceVar(); System.out.println(“ x is :”+x); loc obj=new Loc(); int x=5; // 局部变量 x } } 4.3 实例变量和局部变量 Java中的变量分为两种:类内定义的实例变量,方法中定义的局部变量。 在同一个作用域内,不允许定义两个同名的局部变量。 局部变量可以掩盖实例变量。 实例变量属于对象,它描述了对象的属性,随着对象的存在而存在; 局部变量是随着方法的调用而存在,一旦方法调用结束,局部变量也就消亡了。4.4 构造方法 构造方法的功能是在创建对象时初始化对象的实例变量; 讨论:构造方法的特点: 无返回值,无void 方法名与类名相同 仅在创建对象时调用 class point { // 程序4-3 } public class createPoint { public static void main(String args[ ]){ point p= new point(10,20); System.out.println(p.x +“ ”+p.y);} int x, y;point(int a, int b){ } x=a;y=b; } 如果类中没有定义构造方法,编译器会自动创建一个缺省的、不带参数的构造方法。构造方法是在对象创建之后,new操作完成前被调用的。 4.5 方法重载 方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完全相同;例如: class point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;} point(double a, int b){ x=(double)a;y=b;} } 方法重载的一个误区:是靠返回值区别重载,即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的; 4.6 关键字this this指代对象,是对当前对象的一个引用。例如: class IntVector { // 程序4-6 int v[ ]; boolean equals(IntVector other){ if(this == other)return true; return false;} } class testIntVector { public static void main(String args[ ]){ IntVector t1=new IntVector(),t3=new IntVector(),t2=t1; System.out.println(t1.equals(t2)); System.out.println(t3.equals(t2)); } } Java中的级连调用,仍是指代当前对象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*; class time{ private int hour, min, sec; time(){ setHour(0);setMin(0); setSec(0);} time setHour(int h){ hour=((h>=0 && h<24)? h: 0);return this;} time setMin(int m){ min=((m>=0 && m<60)? m: 0); return this;} time setSec(int s){ sec=((s>=0 && s<60)? s: 0); return this;} String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{ private time t; public void init(){ } t=new time();} public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20); } g.drawString(“ time:”+t.tostring(),25,45);} 在构造方法内部使用this,它用于指代另外一个构造方法,但不能指代非构造方法。例如: class point { } 4.7 继承 继承是软件重用的一种形式,可以提高系统的性能; 继承语法: class className extends superClassName{ 各实例变量和方法的定义 } 例如: class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} point(){ this.x=0; this.y=0;} } class circle extends point{ int radius; circle(int r, int x, int y){ radius=r; this.x=x; this.y=y; } } Java不支持多继承,但支持多接口; 子类的对象也是其超类的对象,反之未必; 继承具有传递性: B继承于A,C又继承于B,则C也继承了A中的实例变量和方法。 关键字super 构造方法是一种特殊的方法,子类不能继承超类的构造方法,但子类构造方法可以通过super调用超类的构造方法。int x, y;point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;} 当创建子类对象时,首先执行超类构造方法,然后执行子类的构造方法。例如: class point{ // 程序4-8 int x, y; point(int x, int y){ } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; System.out.println(“子类构造函数被调用!”); this.x=x;this.y=y; System.out.println(“父类构造函数被调用!”); } } public class testInherence { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); } } 再次讨论构造方法 若父类没有定义构造方法,那么对父类数据的初始化将采用系统缺省的构造方法;例如: class point{ int x, y; } class circle extends point{ int radius; circle(int r, int x, int y){ this.x=x; this.y=y; radius=r; } } 若父类定义有缺省构造方法,那么子类可根据自己的需要设置自己的构造方法。例如: class point{ int x, y; point(){ this(0,0); } point(int x, int y){ this.x=x;this.y=y; } } class circle extends point{ // 注意子类的构造函数 int radius; circle(int r, int x, int y){ radius=r;} } 若父类定义的构造方法都是有参的,那么子类构造方法必须通过super调用父类构造方法,class point{ private int x, y; point(int x, int y){ this.x=x; this.y=y; } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; } } 4.8 方法的覆盖 方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。 4.8.1 覆盖与重载的区别 重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法的特征一定不完全相同。 覆盖特点:子类中的方法特征与父类定义的对应方法的特征完全一样。例如: // 程序4-9 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){super(x, y); radius=r; } double area(){ return Math.PI*radius*radius;} } public class testOverWrite { public static void main(String args[ ]){ } circle c1; c1=new circle(1,1,1); System.out.println(c1.area());} 4.8.2 方法的动态调用 Java的所有对象运行时都有一个类型标识(RTTI:Run-Time Type Identification),该标识记录了每个对象所属于的类。Java用此标识在运行时选择正确的方法。例如: // 程序4-11 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r;} double area(){ // 覆盖了父类的area方法 return Math.PI*radius*radius; } } public class dynamicalCall { public static void main(String args[ ]){ point p[ ]={new point(2,2), new circle(1,1,1)}; for(int i=0;i System.out.print(“类名: ”+ } p[i].getClass().getName());System.out.print(“父类:”+ p[i].getClass().getSuperclass());System.out.println(“ 面积: ”+ } p[i].area());} 子类对象调用方法时: (1)子类检查是否具有同名和同参数类型的方法,若有则调用该方法,否则继续执行。 (2)到父类中寻找同名和同参数类型的方法,若有则调用该方法。若找不到,将产生编译错误。 对象决定自己到底该调用哪个方法,取决于该对象在继承链中的位置。 4.9 多态性不适合继承链中的实例变量 引用.方法:根据多态性调用; 引用.实例变量:根据引用的类型调用。即:多态性仅仅适用于方法的调用,而不适合实例变量。例如: class Base{ // 程序4-12 int x=1;void print(){ System.out.println(“当前类为 ”+ } this.getClass().getName());System.out.println(“对象的x= ”+this.x); } class Derived extends Base{ } int x=2;void print(){ System.out.println(“当前类为 ”+ } this.getClass().getName());System.out.println(“对象的x= ”+this.x); public class confusions{ public static void main(String [ ] args){ Base obj=new Derived(); } } obj.print();System.out.println(“对象的x= ”+obj.x); 4.10 finalize Java的垃圾回收器具有自动回收垃圾的能力。 垃圾回收器是一个优先级比较低的线程,在系统空闲时运行。 在对象被回收之前,有时需要执行一些特殊的操作,例如保存文件、清除屏幕等,这时就要用Java的finalize方法。例如: class point{ // 程序4-13 int x, y; point(int a, int b){ } x=a;y=b;System.out.println(“point constructor:”+getString()); public void finalize(){ // 注意该方法 System.out.println(“point finalizer:”+getString()); } String getString(){ return “x=”+x+“ y=”+y; } } class circle extends point{ int radius; circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString()); } public void finalize(){ System.out.println(“circle finalizer:”+getString()); } String getString(){ return super.getString()+“ radius=”+radius; } } public class testFinalize { public static void main(String args[ ]){ point c1,c2;c1=new circle(1,1,1);c2=new circle(2,2,2);c1=null;c2=null;System.gc(); } } 4.11 static static修饰变量(与C中的不同); static修饰方法(与C中的不同); 4.11.1 static变量 static变量是指这样的成员变量:不管在程序运行中生成多少个该类的对象,它们都共享该变量。 即使没有创建对象,该变量仍然存在。因此,static变量又称为类变量。定义格式为:static type variableName; static变量和一般的实例变量不同,在构造方法中不能对它进行初始化。例如: class point{ // 程序4-14 static int count;int x, y;static{ // 静态初始化块 } } count=0;System.out.println(“static variable is initialized!”); point(int a, int b){ count++;x=a; y=b; System.out.println(“Call point constructor!”);} public class testStaticVariable { public static void main(String args[ ]){ point c1=new point(0,0); System.out.println(“There are ”+ } 4.11.2 static方法 (可举例说明Math类的PI和sqrt等,为什么要用静态变量。)static方法是类中的成员方法,它属于整个类,即使不创建任何对象,也可使用静态方法。调用静态方法格式:类名.方法名(参数); 在子类中不能覆盖父类中定义的静态方法。 静态方法中只能出现静态变量和其它静态方法。并且还不能使用this和super。例如: class point{ // 程序4-15 static int count; int x, y; static{ count=0;System.out.println(“static variable is initialized!”); // 定义静态变量 } point.count +“ points”); } point(int a, int b){ count++;x=a;y=b; System.out.println(“Call point constructor!”); } static int getCount(){ // 静态方法 return count; } } public class testStaticMethod { public static void main(String args[ ]){ } point c1=new point(0,0);point c2=new point(1,1); System.out.println(“There are ”+ point.getCount()+“ points”);} 4.12 关键字final 在实例变量、局部变量和方法的形参定义之前加上final,那么这个变量值只能被引用,而不能修改。 final修饰的局部变量和实例变量必须给出初值,因为它修饰的变量代表一个常量。例如: class Base{ // 程序4-16 final int x=1; // 形式1:修饰实例变量 } public class finalVariables{ public static void main(String [ ] args){ final int var=100;// 形式3:修饰局部变量 } Base obj=new Base(); obj.print(var);void print(final int y){ // 形式2:修饰参数 // y=0; // 错误 } System.out.println(x+y); } 在方法定义前加上final,该方法就不能被子类覆盖,成为终极方法 ; 包含终极方法的类仍然可以被子类继承,子类虽然不能覆盖父类中的终极方法,但可以重载该方法。例如: class Base{ final int x=1; } class Derived extends Base { void print(){ // 重载了父类中的print方法 } System.out.println(x);final void print(int y){ } // 父类中的final方法 System.out.println(x+y);} 4.12.3 final类 在一个类定义前加上final,意味着这个类就不能被其它类继承,成为终极类。 系统类基本上都是final类,如String类。 将class定义为final是为了杜绝继承,类中的方法自然都变成了终极方法。例如: final class Base{ // 声明为final类 final int x=1; void print(final int y){ System.out.println(x+y); } } // 错误:不能继承final 修饰的Base类 class Derived extends Base { } 4.13 组合与继承 面向对象中的软件重用表现为两种形式:继承和对象组合。 设计这类程序的关键是构造方法:子类构造方法调用父类构造、成员对象的初始化。class date{ // 程序4-17 int year, mon,day; date(int y, int m, int d){ year=y; mon=(m>0 && m<13)?m:1;day=checkday(d); } int checkday(int d){ int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(d>0 && d<=daydisp[mon]) return d; if(mon==2 && d==29 &&(year%400==0 || year%4==0&& year%100!=0)) return d;return 1; } String tostring(){ return year+“/”+mon+“/”+day;} } class employee{ // 雇员类 long id;date birthday; 例如: employee(long no, int year, int mon, int day){ id=no; // 设置组合对象 } String tostring(){ return id+“ , ”+birthday.tostring();} birthday=new date(year,mon,day);} class manager extends employee { // 经理类 double basePay; String tostring(){ return basePay+“ , ”+super.tostring();} } public class compositionAndInherence { } public static void main(String [ ] args){ manager boss; } boss=new manager(1001,1971,11,5);System.out.println(boss.tostring()); manager(long no, int y, int m, int d){ super(no,y,m,d); // 调用父类构造函数 } basePay=1000; 4.14 抽象类和抽象方法 抽象方法:仅有方法特征,但没有代码; 抽象类:包含抽象方法的类。 抽象类的作用:提供一种适当的超类,子类通过继承实现父类中的抽象方法。 抽象类不能用final修饰。 抽象类体现了多态性,通过继承可以从抽象类派生出具有相似操作的子类。例如: abstract instrument abstract void play()继承 wind void play()继承 继承 stringed void play()percussion void play()继承 继承 woodwind void play()brass void play() // 程序4-18 abstract class instrument{ abstract void play();} // wind不是抽象类 class wind extends instrument{ void play(){ System.out.println(“wind play!”);} } // percussion也不是抽象类 class percussion extends instrument{ void play(){ System.out.println(“percussion play!”);} } // stringed也不是抽象类 class stringed extends instrument{ void play(){ System.out.println(“stringed play!”);} } class woodWind extends wind{ // 覆盖父类中的play方法 void play(){System.out.println(“woodWind play!”);} } class brass extends wind{ // 覆盖了父类中的play方法 void play(){ System.out.println(“brass play!”);} } public class music { static void tuneAll(instrument e[ ]){ } for(int i=0;i e[i].play(); // 抽象方法 public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5];int i=0; orchestra[i++]=new wind();orchestra[i++]=new percussion();orchestra[i++]=new stringed();orchestra[i++]=new woodWind();orchestra[i++]=new brass();tuneAll(orchestra); } } 程序运行结果: wind play!percussion play!stringed play!woodWind play!brass play! 4.15 对象的类型转换 4.15.1 向上类型转换 从子类向父类转换,在继承图中是向上移动,通常称为向上类型转换。 类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。 进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。例如: // 程序4-19 class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} int getX(){ return x;} } class circle extends point{ int radius;circle(int r, int x, int y){ super(x, y);radius=r;} double area(){ return Math.PI*radius*radius; } } public class testUpCasting { } public static void main(String [ ] args){ circle c=new circle(1,1,1);point p=c;// 注意:p和c的类型不同 } System.out.println(p.getX());4.15.2 向下类型转换 从父类向子类转换,在继承图中是向下移动,称为向下类型转换。 类型向下转换是不安全的,因为这是从一般类型到特殊类型的转换。例如: public static void main(String [ ] args){ } 4.16 访问权限限制 Java提供的访问权限修饰符有四个,即public、private、protected和友元; 修饰符要置于每个类成员(实例变量和成员方法)的定义之前,且仅能控制它所修饰的那个成员。 4.16.1 友员 缺省修饰符的情况就是友员。友员修饰符意味着同一个目录(包)中的所有类都可以访问这种类型的成员。 friendly不属于Java关键字,是C++的一个关键字。 例如: public class Base{ // 该类位于Base.java文件中 int friend_data=1;// 友员数据成员 } // 该类位于Derived.java文件中 public class Derived extends Base{ Base p=new Base(); // 访问Base类中的friend_data } 4.16.2 public 成员 不管两个类是否位于同一个目录中,一个类总可以访问另一个类的public成员。 public还可以用于修饰主类,文件名必须与主类名一致。除此之外,其它3个修饰符都不能用于修饰类,只能修饰成员。例如: public class Base{ public int friend_data=1;// public成员 } void dataUse(){ System.out.println(“data=”+p.friend_data); } point p=new point(1,1);circle c;c=p; //注意:此处编译时出错 c=(circle)p;//注意:此处运行时出错 System.out.println(c.area()); public class Derived extends Base{ public Base p=new Base(); public void dataUse(){ } 4.16.3 private成员 private成员的特性:除了其所在类能够访问该成员以外,其它类都不能访问它。 在多人合作开发一个系统的过程中,private可以让你自由使用自己定义的成员,无须担心与其他人写的类相冲突。例如: // 程序4-20 class Base{ private Base(){ } public class testPrivate { public static void main(String args[ ]){ // Base p=new Base(); // 编译有错 } } Base p = Base.makeBase();} // 注意 } System.out.println(“data=”+p.friend_data);} static Base makeBase(){ return new Base(); 4.16.4 protected成员 protected与继承有关,这种类型的成员可以被子类访问。 同一个包内的非子类,也可以访问这种类型的成员。即:protected天生就具有友元权限,例如: // 程序4-21 class Base{ // 该类位于Base.java文件中 int friend_data=1; // 友元成员 public int public_data=2; // public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } class Derived extends Base{ // Derived.java文件 Base a=new Base();void dataUse(){ } System.out.println(a.friend_data);System.out.println(a.public_data);// System.out.println(a.private_data);System.out.println(a.protected_data);} // 将主类存放在testData.java文件中 public class testData { public static void main(String args[ ]){ } Derived d=new Derived();d.dataUse(); } 访问权限总结 课堂练习: 1、定义一个Student类: 该类的功能有:可以保存、修改和获取学生的姓名、学号等。可以设置学生的英语成绩、数学成绩、Java成绩,并能计算平均分、最高分和最低分。 2、以下代码定义了一个类,请指出其中三条不合法的代码行(行号参见注释)。 class Test22{ //1 //7 } static float fac1(boolean f){ return f?u:v;} //8 float fac2(boolean f){ return f?u:v;} //9 float u; //2 static float v; //3 static void setUV(boolean f){ //4 u=fac1(f); //5 v=fac2(!f); //6 } 课外练习(作业): P87 1、3、4、6 第5章 接口和包 教学目的要求 掌握接口的定义和使用 了解接口与抽象类的异同点 掌握包的定义和使用 主要内容 接口的定义和使用 包的定义和使用 重点内容 接口的定义和使用 包的定义和使用 难点内容 无 1课时 课时分配 教学方法 讲授法、演示法 讲授内容提要 5.1 接口 引入接口的原因:在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。 5.1.1 接口的定义和应用 接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何实现这些方法。 Java允许一个类同时实现多个接口,相当于实现多继承的功能。声明一个接口的语法格式: [public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName(Parameter lists);} 例如: interface Sortable{ // 定义一个接口 int Compare(Sortable s);} 接口中不能声明任何变量和构造方法。 如果一个类实现多个接口,应该在接口名之间用逗号隔开。 当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。例如: // 程序5-1 interface Sortable{ // 定义一个接口 int Compare(Sortable s);} class Sort{ // 定义一个排序类,仅有一个静态的方法 public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable temp; for(i=0;i // 选择排序 k=i; for(j=i+1;j if(a[k].Compare(a[j])<0)k=j; temp=a[i];a[i]=a[k];a[k]=temp;} } } class Student implements Sortable{ // 定义一个学生类 private int score; Student(int x){score=x;} // 实现接口Sortable中的方法 public int Compare(Sortable s){ Student st=(Student)s; // 类型强制转换 return score-st.score;} public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形类也实现了接口 } public class interfaceTest { public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i;private int length,width; Rectangle(int x,int y){ length=x;width=y;} int area(){return length*width;} public int Compare(Sortable s){ // 实现接口 } public String toString(){ return “area=”+area();} Rectangle rec=(Rectangle)s; // 类型强制转换 return area()-rec.area(); for(i=0;i stud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud); // 排序 for(i=0;i System.out.println(stud[i].toString());Rectangle R[ ]=new Rectangle[10];for(i=0;i R[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R); // 排序 for(i=0;i System.out.println(R[i].toString()); } } 接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用这些常量。例如: // 程序5-2的部分 interface constant { int int int int EXCELLENT=5; GOOD=4; PASS=3; FAIL=2;} 在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致; 实现方法时必须在方法前加上public; 若一个类没有对接口中的方法具体实现,那么必须将该类声明为abstract类。例如: interface inter { // 接口 } void methodA(); abstract class Derived1 implements inter { // 此处不需要写出methodA()的原型 } class Derived2 extends Derived1{ public void methodA(){ // 实现方法 } } System.out.println(“Hi,methodA”);5.1.2 接口和抽象类的异同点 接口和抽象类的相同点: (1)都有空的方法,都必须在子类中实现这些方法。 (2)都不能用new关键字来创建这两种类型的对象。 (3)都可以具有继承关系。 (4)接口和类一样可以具有public属性。接口和抽象类的不同点: (1)在抽象类中,空的方法必须加abstract关键字,而在接口中不需要。 (2)在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法。 (3)接口允许多继承,类仅支持单继承。 5.2 包 在Java中可以将自己写的类,按一定的方法归属于不同的子目录中(包)。 在缺省情况下,Java将所有的类归属一个缺省包中。在不同的包中可以有同名的类存在。 Java中的包与C++中的名字空间相似。 5.2.1 package语句 package语句告诉编译器当前类属于哪个包。如果没有package语句,类就存放在无名的缺省包中(即当前目录中)。 引进包的概念主要是为了名字冲突。 格式: package pkgl[.pkg2[.pkg3]]; 5.2.2 import语句 import语句位于package语句之后,类的定义之前;格式:import package1[.package2].(class-name | *); 采用*号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。5.2.3 包应用举例 package Base; // 将该类存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成员 public int public_data=2;// public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } package Derived; // 将Base类存放在Derived包中 import Base.*; // 需要使用Base包中的类 public class Derived extends Base{ Base a=new Base(); // 为了让testData类能调用该方法,修改为public // 不能访问 public void dataUse(){ // System.out.println(a.friend_data); System.out.println(a.public_data); // System.out.println(a.private_data); // 不能访问 // System.out.println(a.protected_data);// 不能访问 } } // testData.java文件的内容如下: import Derived.*; //需要使用Derived包中的类 // 该类位于工作目录,不需要package语句 public class testData { public static void main(String args[ ]){ } } Derived d=new Derived(); d.dataUse(); 课堂练习: 课外练习(作业): P108 3~6 第6章 字符串处理 教学目的要求 掌握字符串的分类; 掌握内容不可改变的字符串类String; 掌握字符串常量; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 主要内容 字符串的分类; 内容不可改变的字符串类String; 字符串常量; 内容可以改变的字符串类StringBuffer; 字符串应用。 重点内容 掌握内容不可改变的字符串类String; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 难点内容 String和StringBuffer的区别和联系 课时分配 2课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 6.1 字符串的分类 java.lang包中定义了 String和StringBuffer两个类; 在运行中值不会改变的字符串,用String类存储;值会改变的字符串用StringBuffer类来存储。 两个类都有final修饰,这样可以优化字符串的操作。 6.2 String类 String类的定义原型 : public final class java.lang.String extends java.lang.Object { … } 6.2.1 字符串常量 字符串常量属于String类型;相同的字符串常量属于同一个对象,占用同一块空间,例如: // 程序6-1 public class TestConstString{ public static void main(String args[ ]){ } } String str1=“Hello”, str2=“Hello”; System.out.println(str1==str2);System.out.println(“Java”==“Java”);6.2.2 创建String类对象 用new运算符,并调用构造函数创建这种类型的对象,常见构造函数如下: 1.public String()采用该构造函数创建一个不含字符的空对象。例如: String str =new String(); 2.public String(char value[ ]) 将字符数组的内容转换为字符串,并赋予新建的对象。例如: char a[ ]={'J','a','v','a'};String str=new String(a);3.public String(char value[ ], int offset, int count) 例如:char a[ ]={'J','a','v','a'}; String str=new String(a,1,2); // 字符串str的内容是“av” 4.public String(String value) 采用value对象的值构造一个新的string对象。 例如: String str1=“Java”;String str2=new String(“Java”); System.out.println(str2); System.out.println(str1==str2); 5.public String(StringBuffer Buffer)注意采用字符串常量初始化一个String引用的问题。例如: String str = “abc”;相当于: char data[ ] = {'a', 'b', 'c'};String str = new String(data);应用举例,注意程序6-2的输出结果: public class TestString{ // 程序6-2 public static void main(String args[ ]){ String s1=“Java”, s2=“Java”;String s3=new String(s1); System.out.println(“ s1==s2 is ”+(s1==s2));System.out.println(“ s1==s3 is ”+(s1==s3));s1=“ABC”;s2=“DEFG”;System.out.println(“ s1==s2 is ”+(s1==s2));s1=s2; System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3 String类常用方法 1.public int length(): 求串长。例如: String str=“Java” ; System.out.println(str.length());2.public char charAt(int index) 提取指定位置上的字符。 3.public int compareTo(String anotherString) 对字符串内容按字典序进行大小比较。例如: public class SortStringArrary{ // 程序6-3 public static void main(String args[ ]){ String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”}; int i,j,k; System.out.print(“排序之前:”);for(i=0;i System.out.print(“t”+s[i]);for(i=0;i for(k=i,j=i+1;j if(s[k].compareTo(s[j])>0) k=j; str=s[i]; s[i]=s[k]; s[k]=str;// 注意该行的含义 } System.out.print(“n排序之后:”);for(i=0;i System.out.print(“t”+s[i]); } } 4.char[ ] toCharArray() 将String对象转换到一个字符数组中,例如: String s=“Hello,Java!”; char a[ ]; a=s.toCharArray(); for(int i=6;i System.out.print(a[i]);5.public boolean equals(String anString) 比较两个字符串对象的内容是否相等。 6.public boolean equalsIgnoreCase(String anotherString) 以忽略大小写方式,比较两个字符串对象的内容是否相等。 注意:equals()方法与“==” 之间的区别。例如: public class ConfuseQuestion{ // 程序6-5 public static void main(String args[ ]){ String s1=“java”; String s2=new String(s1); String s3=s2; } } System.out.println(s1.equals(s2));System.out.println(s2.equals(s3));System.out.println(s2==s3);System.out.println(s2.equals(s3));7.public int indexOf(int ch / String str) 在字符串中搜索字符或子串,返回字符或子串在String对象中从左边起首次出现的位置。如果没有出现,返回-1。 8.public String substring(int begin, int end) 提取string对象中从begin开始,到end-1结束的子串,返回提取的子串。 9.public String concat(String str)将str对象接到调用对象的后面,返回新串。例如: String s1=“Hello ” , s2=“Java” , s3;s3=s1.concat(s2); System.out.println(s3);注意:如果参数str为空(null),则concat方法不创建新串,而仅仅返回当前串,10.public String replace(char oldChar, char newChar) 将String对象中所有的oldChar字符替换为newChar,返回替换后的新串。例如: String path=“d:/myjava/documents”; System.out.println(path.replace('/' , '')); public String toString() 返回当前字符串对象本身。 12.public static String valueOf(各种类型 f) 将各种数据类型转换成一个相应的字符串表示,该方法是一个static方法。 程序6-6演示了valueOf()方法的应用。 程序6-7自学。 public class TestValueOf{ // 程序6-6 public static void main(String args[ ]){ char a[ ]={'A','B','C','D','E','F'}; int i=123456;float f=3.14159f;boolean b=true;Object o=null;System.out.println(String.valueOf(a));System.out.println(String.valueOf(a,2,3));System.out.println(String.valueOf(i));System.out.println(String.valueOf(f));System.out.println(String.valueOf(b)); System.out.println(String.valueOf(o));} } 6.2.4 Java应用程序的命令行参数 应用程序可以通过main方法的String数组,访问由解释器传递的命令行参数。例如: public class ShowMainArguments{ //程序6-8 public static void main(String args[ ]){ for(int i = 0;i < args.length;i++) System.out.println(args[ i ]); } } 6.3 StringBuffer类 StringBuffer类对象是一个内容可以改变的字符串。可以减少由于少量字符的插人而引起的空间分配问题。 StringBuffer类的原型: public final class java.lang.StringBuffer extends java.lang.Object { … } StringBuffer类对象有一块缓冲区,字符串被存放在缓冲区中,缓冲区的大小可以随程序的需要进行调整。缓冲区的大小称为对象的容量。 当修改对象的内容时,只要StringBuffer对象包含的字符个数没有超出容量,就不会分配新的空间,而直接在原空间内进行修改。若字符的个数超出了容量,该对象会自动调整其容量,从而适应新的存储。 6.3.1 创建StringBuffer类对象 StringBuffer类的构造函数有三种方式: 1.public StringBuffer()创建一个内容为空的StringBuffer对象,容量为16。 例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始内容为空,容量为length指定的大小。注意:length应大于等于0,不能为负数,否则会产生异常。例如: StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str) 初始内容和参数str的内容相同,容量为参数str的长度加上16。例如: String s1=“Java”; StringBuffer s2=new StringBuffer(s1);则s2的容量是20,内容是“Java”。 6.3.2 StringBuffer类常用方法 1.public int length() 返回字符串的长度 2.public int capacity() 返回缓冲区大小 3.public void setLength(int newLength) 指定对象的长度,将对象的内容进行裁减。如果参数小于对象的长度,则将对象截断;如果参数大于等于对象的长度,则填充空字符('u0')扩充新增加的部分。 4.public void ensureCapacity(int NewCapacity) 设定对象的缓冲区的大小,若参数 小于对象的容量,则新的设置将不起作用,也就是说容量只能扩大而不能缩小。 程序6-9演示了这几个方法的具体应用。 public class TestCapacity{ // 程序6-9 public static void main(String args[ ]){ String s=“Java”; StringBuffer str=new StringBuffer(s);System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8); // 设置长度为8 str.ensureCapacity(80);// 设置容量为80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); str.setLength(3); str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); } } 5.public void setCharAt(int index, char ch) 将参数index指定位置上的字符,设置成参数ch 指定的字符。例如: StringBuffer str=new StringBuffer(“Hello,Java”); str.setCharAt(3,'L'); 则str的内容变成了“HelLo,Java” 6.public StringBuffer append(多种数据类型) 将其它类型的数据添加到StringBuffer对象的尾部,返回修改后的StringBuffer对象。 例如:StringBuffer s1,s2=new StringBuffer(); s1=s2;// s1和s2代表同一个对象 s2.append(3.14).append(' ').append(“Java”); System.out.println(s1==s2); // 输出true System.out.println(s1); // 输出3.14 Java 7.public String toString() 该方法把StringBuffer对象的内容复制到一个新的String类对象中,返回这个新的String类对象。例如程序6-10。 public class BufferToString{ // 程序6-10 public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”);s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2); } } 8.public StringBuffer insert(int offset, 多种类型 b)该方法是将一个其它类型的对象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“); // 将字符串”Hello“插入到下标为0的位置 str.insert(0,”Hello“); System.out.println(”str= “+str);输出结果为: str= Hello Java! 6.4 略 应用举例 课堂练习: 无 课外练习(作业): P119 2、3、4 第7章 异常处理 教学目的要求 了解异常的层次结构; 掌握异常处理语句; 了解自定义异常; 了解异常处理中常用的调试方法。主要内容 异常的层次结构; 异常处理语句; 自定义异常; 异常处理中常用的调试方法。 重点内容 异常处理语句; 难点内容 无 课时分配 1课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 7.1 异常的层次结构 Throwable是异常类的根节点,定义在java.lang包,它的子类也定义在该包中; Error代表系统错误类,由系统直接处理; Exception类及其子类是在程序中可捕捉到的异常。见图7.1 Throwable Error achineError … AW TError LinkageError VirtualM RuntimeException ArithmeticException ArrayIndexO utO fBoundsException … Interrupted Exception AWTException IOException Exception FileNotFoundException… EOFException 1.java.lang.ArithmeticException 0作除数(包括模),将产生这类异常。例如:int x=0 , y; y=100/x; 2.java.lang.ArrayIndexOutOfBoundsException 例如:int a[ ]=new int[10]; a[10]=0; 3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10]; boolean b[ ]=new boolean[10]; System.arraycopy(a,0,b,3,6);//有异常 4.java.lang.ClassCastException 例如: Object obj=new Object(); int a[ ]=(int[ ])(obj); 5.java.lang.IndexOutOfBoundsException 例如:char ch=”ABC“.charAt(99); 注意: 2 是5的子类。 6.java.lang.NegativeArraySizeException 例如: int a[ ]=new int[-10]; 7.java.lang.NullPointerException 例如:int a[ ]=null; System.out.print(a.length);7.2 异常处理语句 缺省的异常处理的情况,例如: public class DefaultException{ // 程序7-1 public static void main(String args[ ]){ int a,b=0; a=2/b; // 此处有异常 System.out.println(“a=”+a);// 不运行此行 } } 异常处理语句有try、catch、finally、throw和throws。异常处理的形式为: try{ 程序执行体 }catch(异常类型1 异常对象1){ 异常处理程序体1 }catch(异常类型2 异常对象2){ 异常处理程序体2 }finally { 异常处理结束前的执行程序体 } 7.2.1 try和catch语句 try语句指明可能产生异常的代码段;catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。异常处理以后,程序从try语句代码段后继续执行。例如:程序7-2。public class TryCatchTest{ // 程序7-2 public static void main(String args[ ]){ int a=99,b=0,c; try{ System.out.println(”产生异常之前“);c=a/b; // 该行有异常 System.out.println(”产生异常之后“);}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理下标越界异常“);}catch(ArithmeticException e){ System.out.println(”处理算术异常“);} System.out.println(”异常处理结束“); } } 注意:用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理。例如: int a=99,b=0,c; try{ c=a/b;//产生的异常和捕捉的异常类型不一致 }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理异常“); } 注意:当有多个catch语句时,系统依照先后顺序逐个检查。例如: try{ c=a/b; }catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){ System.out.println(”Divided by zero“);} 7.2.2 finally语句 无论是否产生异常,finally语句指明的代码一定被执行。例如: public class testFinally{ // 程序7-3 public static void main(String args[ ]){ int a,b=0; for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{ switch(i){ } case 0: a=3/b; break;case 1: int c[ ]=new int[10]; c[10]=0; break;case 2: char ch=”ABC“.charAt(99); break;case 3: return;}catch(ArithmeticException e){ System.out.println(“零作除数!”); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”数组下标越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下标越界!“);}finally{ System.out.println(”在finally块中!“); } } 7.2.3 throw语句 throw语句用于指出当前行有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。 throw语句可以将异常对象提交给调用者,以进行再次处理。例如:程序7-4。public class ThrowException{ // 程序7-4 public static void Test(){ try{ int c[ ]=new int[10];c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 数组下标越界!“); } } throw e; // 异常抛出点 //System.out.println(“t产生异常后!”); 该行无法通过编译 } } public static void main(String args[ ]){ try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下标越界!“);}finally{ System.out.println(”t 在finally块中!“);} } } 7.2.4 throws语句 throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。例如: import java.io.*; // 程序7-6 public class testThrows { public static String readString()throws IOException{ int ch;String r=”“;boolean done=false; while(!done){ ch=System.in.read(); } if(ch<0 || ch==0xd) done=true;else r = r +(char)ch; return r; } public static void main(String args[ ]){ String str; try{ str=readString();}catch(IOException e){ System.out.println(”产生了输出/输出异常“); return;} System.out.println(”整数是:"+Integer.parseInt(str)); } } 建议:在多人合作写程序时,一个方法中产生的异常,最好在该方法中进行处理,不要将异常传播给其他人处理。 7.3 自定义异常类 通过继承Exception类或它的子类,实现自定义异常类; 对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。总体上分为两步: 第1步:定义异常类。例如: class userException extends Exception{ int n=0; // 计数器 Java程序设计 第一讲 绪论 一、安装netbean系统 二、hello world 典型程序结构中各部分的说明: /* * To change this template, choose Tools | Templates * and open the template in the editor.*/ package test1; //@author Jie public class Test1 { public static void main(String[] args){ System.out.println(“Hello World!”); } } 1、注释语句 2、类定义的包:package 3、public class Test1,定义类,类名称是Test1,属性为public 4、public static void main(String[] args),main函数 5、main函数的函数体{ System.out.println(“Hello World!”); } 三、Java程序设计语言的基本内容: 数据类型 运算符&表达式 3 程序控制语句 4 数组 5 类 6 对象 7 继承 8 接口 9 包 APPLET 11 异常处理 12 线程 13 字符串 14 GUI 15 输入输出系统 我们的课堂教学内容:时间17周,包括17次课堂教学,17次实验室上机。 四、几个案例: 1、计算根号2; 2、显示1-100 3、从1加到100 4、打印一个“*”组成的10*10的矩形 5、求N!,递归算法 6、GUI的例子,在GUI界面下输入和显示(this.jLabel1.setText(this.jTextField1.getText());) 7、演示几个复杂一点例子 五、Java语言中保留的关键字: Java语言一共使用了48个保留关键字,他们主要可以 分为如下几类。 1.访问控制 private , protected , public.2.类、方法和变量修饰符 abstract , class , extends , final , implements , interface, native(用于与其他语言的接口), new , static strictfp:java 语言采用固定的位数来存储浮点型数据,但是有些处理器使用更高位的浮点寄存器,这些寄存器增加了中间过程的计算精度。例如double类型数据jvm采用64为存储,二有些处理器使用80位的浮点寄存器来保存中间数据。例如:double w = x*y/z;很多处理器计算x*y后将中间结果存储在80位的寄存器中,再除以z并将结果截断为64位;但是这个结果可能会与始终在64位机器上计算的结果不一致,如果将所有的中间结果都截断,可能会导致溢出,而截断操作同样需要时间,计算速度比较慢。 因此JVM默认允许中间结果精度扩展。但是在使用关键字strictfp标记的方法,必须使用严格的浮点计算。使用strictfp标记的类中所有的方法都必须严格按照浮点计算。 synchronized:多线程同步访问控制 transient:transient 关键字表示在Serializable 的时候不保存该值 volatile:Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 3.程序控制语句 break, continue, return, do, while, if, else, for, instanceof, switch, case,default, 4.错误处理 catch 捕获, finally 最后, throw 投试, throws 投试, try 尝试 5.包相关 import 输入, package 包.6.基本类型 boolean 布尔型, byte 字节型, char 字符型, double 双精度, float 浮点, int 整型, long 长整型, short 短整型 7.变量引用 super 特殊, this 这个, void 无值 除了这48个关键字以外,还有3个语法保留字: null 空, true 真, false 假.六、如何学习一门程序设计语言 1、理解什么是程序设计语言 2、练习、练习、再练习 第二讲 数据类型、运算符与表达式 一、Java语言中的数据类型 数据类型 大小 范围 默认值 byte(字节) -12832768 0 int(整型) -2147483648-2147483648 0 long(长整型) -***7808-***7808 0 float(浮点型) 32-3.40292347E+38-3.40292347E+38 0.0f double(双精度) -1.797693***E+308-1.797693***E+308 0.0d char(字符型) „ u0000-+=!~ +(一元)-(一元) 左右 * / % 右左 +(二元)-(二元) 右左 << >> >>> 右左 < > <= >= instanceof 右左 = =!= 右左 & 右左 ^ 右左 | 右左 && 右左 || 右左 ?: 左右 = *= /= %= += -= <<= >>= >>>= &= ^= |= 左右 三、实验课任务 1、熟悉netbeans的工作环境,自己编写HELLO WORLD程序 2、输入并运行测试,至少10个不同运算符号组合的算术表达式 3、输入并运行测试,至少5个不同运算符号组合的逻辑表达式 4、联系字符串对象的基本用法:声明赋值对象,显示对象,两个字符串连接,截取子串等 第三讲 输入输出 一、介绍数据流的概念 1、流的基本概念 2、字节流 字节是8比特,等价于0-255范围的十进制数。字节是计算机中最基本的编码单位。如字符型是2个字节,浮点型是4个字节。 字符流的顶层包括inputstream和outputstream两个抽象类。可以通过fileinoutstream和fileoutputstream两个子类对文件进行输入和输出。通过datainputstream和dataoutputstream两个子类处理整数、浮点数等数据。 3、字符流 字符流是特殊的字节流,专门用于处理字符数据,目前的字符集通常是unicode,16比特,一个字符是两个字节。 顶层有两个抽象类:reader和writer,有两个最主要的方法:read(),write() 4、预定义流 标准输入流:in 标准输出流:out 出错流:err 举例: 输出一串字符,在显示器上显示出来 二、文件字节流 1、文件字节流的输入输出 常用方法: read(),write(ch)案例1:在显示器上显示文本文件的内容。案例2:复制文件 2、文件字节流的随机访问 常用方法: 1、读数据方法:readInt()readBoolean()readLine() 2、写数据方法:wirteChar()writerDouble() 3、指针控制方法: long getFilePointer();void seek(long pos);int skipBytes(int n)案例:建立一个可读写随机访问文件,写入10个浮点数,然后关闭该文件。再次以读写方式打开该文件,修改其中第3个数据,然后关闭该文件。再次以只读方式打开盖文件,显示文件内容,然后关闭该文件。 三、过滤流 过滤流是对输入输出流提供了一种包装。我们主要介绍一组: DataInputStream DataOutputStream 案例:从键盘输入一些同学的信息,将信息保存到文件中。 四、字符流 五、File类 六、对象的串行化 第四讲 程序控制语句 第五讲 综合练习第六讲 数组 第七讲 函数、函数调用、递归函数 第八讲 综合练习第九讲 类和对象 第十讲 继承、接口和包与异常处理 第十一讲 综合练习第十二讲APPLET、GUI 第十三讲 线程 第十四讲 综合练习 第十五讲 字符串及信息处理的应用 第十七讲 综合练习 课程教案 (理论教学) 课程名称: Java程序设计 课程类型:(2) 1、必修; 2、选修; 3、其它 授课对象: 专业(本科)级 班 授课时间: 至 学年第 学期 计划学时: 学时(其中:理论,实验:) 任课教师: 所属学院: 课程管理部门(教研室): 大理学院教务处 制 课程名称:Java程序设计 教 材:Java程序设计教程 讲 授 人: 专业技术职务:讲师 学 历: 研究生 学 位:硕士 讲授题目: 所属章节: 计划学时: 教学目的和要求: 教学重点: 教学难点: 教学方法: 使用教具 大理学院课程教案(教学内容) 第一章 Java语言简介 教学目的要求 了解Java的基本特点和用途 掌握如何下载Java SDK软件包 了解设置Java程序的开发环境SDK 如何运行Java程序 了解Java的概貌 主要内容 Java语言的发展历程; Java语言的特点; Java语言的开发工具; Java应用程序和小程序; Java程序的注释方法; 写Java程序的风格规范。重点内容 Java语言的特点; Java语言的开发工具; Java应用程序和小程序; 难点内容 无 课时分配 1课时 教学方法 讲授法、演示法、对比法 讲授内容提要 1.1 Java语言的发展简介 1991年Sun Mircosystem 公司成立了一个Green项目开发小组,Jame Gosling 为组长; 设计Java 采用虚拟机代码(Virtual Machine Code),即.class文件,它通过解释器运行 ; 1995年5月Sun Mircosystem 公司对外正式发布Java1.0; Java2 用途:适用于各种应用开发,尤其是网络应用,网络服务和嵌入式系统。1.2 Java语言的特点 1.简单性 2.面向对象 3.网络适用性 4.健壮性 5.安全性 6.平台无关性 7.可移植性 8.解释型 9.高性能 / 87 大理学院课程教案(教学内容) 10.多线程 11.动态性 12.丰富的类库 13.嵌入浏览器运行 1.3 Java类库的概念 1.4 网络浏览器 1.5 Java开发工具 NetBeans: 这个集成环境可以方便地进行程序的编辑、编译、生成和运行。J2sdk : http:// java.sun.com免费下载;Visual J++ 6.0 / 8.0: VJ++还吸收了VB集成开发环境IDE的特征,是一个强有力的Java程序开发工具。Jcreator Eclipse(MyEclipse)等 1.6 Java程序的分类 基于控制台的应用程序; 基于浏览器运行的小程序applet。 小程序与应用程序的区别是:小程序必须依赖一个HTML文件和支持Java的网络浏览器。老师演示小程序和applet程序 应用程序举例(程序1-1): public class hello { public static void main(String args[ ]){ System.out.println(“Hello Java!”); } } 小程序举例(程序1-2): import java.awt.Graphics; // 注意该行的含义 import java.applet.Applet;public class sayhello extends Applet { public void paint(Graphics g){ g.drawString(“Hello Java!”,35,30); } } 小程序对应的HTML文件: / 87 大理学院课程教案(教学内容) 1.7 1.8 对Java程序的解释 编写Java程序的风格要求 课堂练习: 请编写一个应用程序输出你自己的学号和姓名 课外练习(作业): 下载并安装J2SDK; 设置系统环境变量 下载并安装MyEclipse 熟悉MyEclipse的开发环境 第2章 数据类型、运算符和表达式 教学目的要求 掌握字符常量和符号表示的常量的概念和应用 掌握整形、浮点型、字符型和布尔型变量的概念和应用 掌握数据的概念 理解参数传递方式 学会逻辑运算符、算术运算符和位运算符的使用方法 主要内容 常量:包括字面常量和符号表示的常量; 变量:整形、浮点型、字符型和布尔型; 数组:Java的数组属于类类型; 参数传递方式; 运算符:包括逻辑运算符、算术运算符和位运算符等; 重点内容 整形、浮点型、字符型和布尔型变量的概念和应用; 符常量和符号表示的常量的概念和应用 难点内容 参数传递方式 课时分配 2课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 2.1 常量 整形常量:采用八进制、十进制、十六进制表示,但不能采用二进制表示,和C/C++中的一样。 浮点常量:采用十进制或科学记数法表示。在缺省情况下一个浮点数是double型。布尔常量:true和false,它们不是数,不能进行算术运算。字符常量:与C/C++中的表示类似 。字符串常量:Java中字符串常量是对象。2.2 变量 变量的命名原则是:以字母(’a’„’z’和 ’A’„’Z’)、下划线(‘_’)和‘$’符号开头的,由字母、数字(’0’„’9’)、下划线和‘$’构成的一个符号序列。 例如,a,_a,NameOfStudent,$10均是合法变量名,而-a和9a是非法变量名。关键字不能用作变 / 87 大理学院课程教案(教学内容) 量名(见表2-1)注意:Java对变量是区分大小写.2.2.1 整形类型的变量 字节(byte)型,8个位。 短整形(short),占16个位。整形(int),占32个位。 长整形(long int),占64个位。 Java中的整形最值均有符号。例如程序2-1测试最值: public class Test_Int { // 程序2-1 测试整形变量的最值 public static void main(String [ ] args){ System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE); System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE); System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); } } 注意: byte、short、int、long是原子类型,而Byte、Short、Integer和Long分别是四种原子类型对应的类类型。 2.2.2 字符类型变量 Java字符量的长度为16个位,表示范围是从‘u0000’ 到 ‘uffff’ 即从0 到 65535; Character是char类型对应的类类型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3 浮点类型变量 分类:float和double。 Float、Double 是对应的类类型 ; Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和 Float.NEGATIVE_INFINITY是正/负无限大。2.2.4 布尔类型变量 boolean变量取值:true和false ; true和false不能转换成任何数值表示,true不是1,false也不是0。2.2.5 原子类型变量的生存空间 一个变量的生存空间是由两个大括号决定的 范围。下列写法在C/C++中是正确的,但在Java中是错误的(注意)。{ int x=1;{ / 87 大理学院课程教案(教学内容) int x=0;// 错误 } } 2.3 变量赋值问题 如果类中定义的原子类型变量,未给出初值,那么它们将有缺省值 :byte、short、int 和long变量的缺省值是0;char、float、double和boolean变量的缺省值分别是’u0’、0.0f、0.0d和false。 方法内定义的局部变量,应当对其赋值,否则无法通过编译。例如: // 程序2-4 class Test { // 定义一个类 int Value;// 类中的变量未赋值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){ int x=100; // 必须赋值,否则无法通过编译 Test obj=new Test();// 对象赋值 System.out.println(obj.Value +“ ”+x); } } 2.4 数组 Java数组是系统定义类Array 的子类; 数组的分类同C/C++:一维和多维。2.4.1 一维数组 定义数组的格式 :int a[ ] ; 或 int[ ] a ;其值是null ; 在定义数组时不能指定大小。a仅是一个引用,代表一个数组名,但没有对应的空间。产生数组空间的方法有两种 : 在定义时直接赋值:int a[ ]={1,2,3}; 通过new分配空间: int a[ ]=new int[10];public class Test_Array{ public static void main(String [ ] args){ int a[ ]={1,2,3}, b[ ]; b= a; for(int i=0;i<3;i++)b[ i ]++; for(int i=0;i<3;i++)System.out.println(a[i]); } } public class Test_Array{ public static void main(String [ ] args){ int a[ ]={1,2,3}, b[ ]; b = new int[6]; System.out.println(“b数组长度 = ” + b.length); for(int i=0;i System.out.print(b[i]+“ / 87 ”); 大理学院课程教案(教学内容) } } 注意:(1)获得数组元素的个数:数组名.length; (2)一个整形数组若仅仅采用new分配空间,而没有对其赋值,那么每个元素的值是0 注意:Java数组名是一个引用,当将一个数组名赋值给另一个数组时,实际上是名字的复制 2.5 Java中的参数传递方式 Java的参数传递的形式有两种:基本类型按值传递,对象类型按引用传递; 通过return语句从方法中返回时,基本类型总是以值的方式返回,而对象总是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras { static test fun(test o,int y){ o.x=20; y=1; return o;} public static void main(String [ ] args){ test obj1 , obj2; int Val = 3; obj1=new test(); obj1.x=100; obj2=fun(obj1,Val); System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val); } } 2.6 Java的运算符 主要包括: 算术运算符、关系运算符、逻辑运算符、位运算符和三元条件运算符。2.6.1 算术运算符 算术运算符:+、-、*、/、%、++和--,与C/C++基本相同。 %运算符不但可以对整形数据运算,而且可以对浮点型数据运算。例如:3.14 % 2.5的值约等于0.64 ; 隠式数据类型转换: 当整型与浮点型数据进行混合运算时,表达式中的数据类型会进行相应的自动转换,规则为:byte->short->int->long->float->double。 这种转换规则也适应于赋值语句,当赋值符左右两侧变量类型不一致时,只要转换过程中不丢失数据,便进行自动转换。 class number { int x;} public class relationalOperator{ public static void main(String args[ ]){ / 87 大理学院课程教案(教学内容) number n1,n2; n1=new number(); n2=new number(); n1.x=1; n2.x=1; if(n1.x==n2.x) System.out.println(“对象的数据成员x相等!”); if(n1==n2) System.out.println(“n1和n2是一个对象!”);else System.out.println(“n1和n2不是一个对象!”);} } 2.6.2 关系运算符 关系运算符不能同其它类型的变量一同 参与运算,例如假设a,b,c是三个整形的变量,那么 a=b==c 是 正确 OR 错误? ; 关系运算符用于对象时,是判别两个引用是否代表同一个对象。而不是判断两个引用所指向的对象是否同属一个类。 2.6.3 逻辑运算符 逻辑运算符有&&、|| 和!,分别是与、或和非。运算结果是true或false; 逻辑运算有求值“短路”现象,例如程序2-11 : public class shortCut { static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1)); return x < 1; } static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2)); return x < 2; } public static void main(String [ ] args){ if(testOne(6)&& testTwo(1)) System.out.println(“表达式为真”); else System.out.println(“表达式为假”);} } 2.6.4 位运算符 / 87 大理学院课程教案(教学内容) 位运算符:&、|、^、~、<<、>>,分别称为位与、或、异或、左移、右移; Java引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。例如: int a=-2 , b; b=a>>>30;2.6.5 三元条件运算符 语法格式:(exp)?(exp1):(exp2); Java要求:(exp1)与(exp2)必须同类型。2.6.6 “+”运算符 Java对“+”进行了重载,可以将任何类型的对象(包含原子类型)转化为String类型。例如: int x=1; char ch='A'; double d=9.8; System.out.println(“Result: ”+x+ch+9.8);课堂练习: 课外练习(作业): P32 3、4、6题。 第3章 控制语句 教学目的要求 了解Java程序的结构,学习使用各种语句结构来控制程序的流程,完成程序的功能任务。主要内容 Java的分支语句; 循环控制语句; break和continue语句; 带标号的break和continue语句。 重点内容 Java的分支语句; 循环控制语句; break和continue语句; 难点内容 循环控制语句; break和continue语句; 课时分配 3课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 3.1 分支语句 / 87 大理学院课程教案(教学内容) if-else语句; switch-case语句。3.1.1 if 语句 if语句的语法格式 同C/C++; 条件表达式必须是布尔类型,例如: 下面的写法在C/C++中是合法的,但在Java中却是非法的 : int i=10;if(i) ...程序3-1描述了用applet从文本框获取数据,然后将比较的结果显示出来。 // 程序 3-1 import java.awt.*;import java.applet.*; public class compareNumbers extends Applet{ Label lab1,lab2;TextField input1,input2;int num1,num2;public void init(){ lab1=new Label(“输入第1个整数”); input1=new TextField(10); lab2=new Label(“输入第2个整数”); input2=new TextField(10); add(lab1); add(input1); add(lab2); add(input2);} public boolean action(Event e , Object o){ if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText()); num2=Integer.parseInt(input2.getText()); if(num1 showStatus(num1 + “ < ” + num2); else if(num1>num2) showStatus(num1+“ > ”+num2); else showStatus(num1+“ == ”+num2); } return true;} } 3.1.2 switch 语句 / 87 大理学院课程教案(教学内容) switch语句的语法结构 同C/C++; switch后面的表达式类型必须是字符类型或整形 ; case后面的常量不能重复 ; 程序3-3采用小程序实现将学生的百分制成绩转换为优、良,中、及格和不通过五个等级: // 程序3-3 import java.awt.*;import java.applet.*; public class scoreConvert extends Applet{ Label prompt;TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“输入成绩”); input=new TextField(2); add(prompt); add(input);} public void paint(Graphics g){ g.drawString(“各等级的人数:”,25,40); g.drawString(“优秀 : ”+Excellent,25,55); g.drawString(“良好 : ”+Good,25,70); g.drawString(“中等 : ”+Middle,25,85); g.drawString(“及格 : ”+Pass,25,100); g.drawString(“不通过: ”+Failure,25,115);} public boolean action(Event e , Object o){ int score=Integer.parseInt(input.getText()); showStatus(“"); input.setText(”“); switch(score/10){ case 10: case 9: Excellent++; break; case 8: Good++; break; case 7: Middle++; break; case 6: Pass++; break; case 5: case 4: case 3: case 2: case 1: case 0: Failure++; break; default: showStatus(”输入有误,重新输入!“); } repaint(); / 87 大理学院课程教案(教学内容) return true;} } 程序3-3需要注意的地方 在action()方法中调用的repaint()方法,是一个系统方法,它具有自动调用paint()方法的能力,从而实现对网页的刷新。3.2 循环控制语句 Java中的循环控制语句有三种,分别是:while,do-while和for语句;循环体内的语句会反复执行,直到控制布尔表达式的值变为false为止。3.2.1 while语句 while语句格式: while(Boolean-Expression) StatementS 程序示例3-4 略 3.2.2 do-while语句 do-while语句的语法格式如下: do{ Statement }while(Boolean-Expression); 程序3-5 如下: // 产生一个大于0.9的随机数为止 public class GenerateDoubleNumbers { public static void main(String args[ ]){ double d; do{ d=Math.random(); System.out.println(d); }while(d<0.9);} } 3.2.3 for语句 for语句语法格式如下: for(ForInitopt;Boolean-Expression;ForUpdateopt) Statement // 程序3-6输出一个*三角形 public class printGraphics extends Applet{ public void paint(Graphics g){ int xpos,ypos=0; for(int row=6;row>=1;row--){ / 87 大理学院课程教案(教学内容) xpos=25; ypos+=15; for(int column=1;column<=row;column++){ g.drawString(”*“,xpos,ypos); xpos+=7; } } } } 3.3 break语句和continue语句 3.3.1 不带标号的break语句和continue语句 break语句可以跳出包含它的最内层的循环,不再执行剩余的语句; continue语句停止执行当前的循环,回到循环处,开始执行下一轮的循环。这些特性和C/C++的功能一样。 for(int i=1;i<10;i++) { if(i%3==0) continue; else System.out.println(”i = “+i); } for(int i=1;i<10;i++) { if(i%3==0) break; else System.out.println(”i = “+i); } 课堂练习: 1、仔细分析下面程序,写出程序的最终运行结果。public class s_switch { public static void main(String args[]) { int ch=8; int r=10; switch(ch-1){ case 7: r=r+3; / 87 大理学院课程教案(教学内容) case 8: r=r+5; case 9: r=r+6;break; default:; } System.out.println(”r=“+r); } } 2、随机产生26个英文字母a~z,直到大于u为止。用while和for语句实现。 课外练习(作业): P44 1—4 第4章 Java的类 教学目的要求 理解面向对象编程的基本概念 了解类的封装方法 如何创建类和对象 了解成员变量和成员方法的特性 学习使用OOP方式进行程序设计 深刻理解类的继承性和多态性 主要内容 类的定义和使用; 方法的定义和使用; 实例变量和局部变量; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; 组合与继承; 抽象方法和抽象类; 对象类型转换; 访问权限限制符:public、private、protected。 重点内容 类的定义和使用; 方法的定义和使用; 构造方法; 方法的覆盖和重载; 关键字this的用法; 继承的概念和应用; / 87 大理学院课程教案(教学内容) 组合与继承; 抽象方法和抽象类; 对象类型转换; 难点内容 构造方法; 方法的覆盖和重载; 继承的概念和应用; 组合与继承; 抽象方法和抽象类 课时分配 8课时 教学方法 讲授法、演示法、对比法、实验验证法、学生讨论法 讲授内容提要 4.1 类与对象 在Java程序中,除原子类型的变量以外都是对象,连Java程序本身也不例外。 类是面向对象程序设计的基础,OO始终是围绕着对象的封装性、继承性和多态性展开讨论的。4.1.1 类与对象的区别 类是一个抽象的概念,对象是一个具体的概念。 类是在一组对象的基础上,通过抽象和概括获得的一个概念。 对象是由数据和方法紧密结合的一个封装体,具有信息隐藏的能力。 对象可以通过方法(函数)与其它对象进行通信,但并不知道这些方法的实现细节。4.1.2 Java和C编程思想的区别 C是结构化的编程语言,以函数为编程单元,程序员把注意力集中在编写函数上。Java是面向对象的编程语言,以类为编程单元,程序员的精力集中在对类的设计上。 对象将实例变量(instance variable)和对数据的操作(即方法)约束在一起,类似一个独立的程序,易于扩充,易于维护,代码可复用。4.1.3 如何定义类 类是对象的模板,它定义了对象的结构和操作数据的方法。public class Sayhello extends Applet { public void paint(Graphics g){ int xPos=35; int yPos=30; g.drawString(”Hello Java!“,xPos,yPos); } } 定义类的通用格式如下: class className extends superClassName{ type instance-vairbale1; return-type methodName1(parameter-list){ method-body;} / 87 大理学院课程教案(教学内容) } public class Hello { public static void main(String args[ ]){ System.out.println(”Hello Java!“); } } 系统类Object是整个类层次结构中的根。如果我们要定义Object的子类,可以不指明extends Object,默认情况下一个类就是Object类的子类。类内定义的变量称为实例变量,函数称为方法; Java将类的定义和类的实现放在一起,便于系统维护。例如: class point { // Object类的子类 int x , y; void init(int a, int b){ int i=0; x=a; y=b; } } 4.1.4 对象和引用 对象是客观存在的变量,对象的引用就是对象的名字,例如:Point p1;创建对象:p1=new Point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。例如: class Point { // 程序4-1 int x , y; void init(int a, int b){ x=a; y=b; } } public class TwoPoint{ public static void main(String [ ]args){ Point p1= new Point(), p2= new Point(); p1.x=10;p1.y=20; p2.x=30;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y); } } 4.2 方法 方法是一个功能模块,类似C中的函数; 方法和实例变量都必须定义在类内,方法是类的功能接口 ; 定义方法的原则:方法应当只执行单一的任务,并且方法名能有效地表达该任务; / 87 大理学院课程教案(教学内容) 方法的返回值类型、方法名和参数表共同称之为方法的特征。调用方法的格式:引用.方法名(参数表);例如: Point p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//仅对p1对象的x和y进行赋值 p2.init(30,40);//仅对p2对象的x和y进行赋值 对象是客观存在的变量,对象的引用就是对象的名字,例如:point p1;创建对象:p1=new point(); 一个对象可以有多个别名; p2=p1;将一个变量设置为null,表明该变量不代表任何对象 : p1 = null; 每个对象都有自己的变量,改变一个对象的实例变量并不影响到另外一个对象。 4.3 实例变量和局部变量 class Loc { // 程序4-2 int x=1;// 实例变量 void printLocVar(){ int x=25;// 局部变量 System.out.println(”n x is :“+x); ++x; System.out.println(” x is :“+x);} void printInstanceVar(){ System.out.println(”n x is :“+x); x*=10; System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主类 public static void main(String args[ ]){ loc obj=new Loc(); int x=5; // 局部变量 x System.out.println(“ x is :”+x); obj.printLocVar(); obj.printInstanceVar(); System.out.println(“ x is :”+x);} } 4.3 实例变量和局部变量 Java中的变量分为两种:类内定义的实例变量,方法中定义的局部变量。 在同一个作用域内,不允许定义两个同名的局部变量。 局部变量可以掩盖实例变量。 / 87 大理学院课程教案(教学内容) 实例变量属于对象,它描述了对象的属性,随着对象的存在而存在; 局部变量是随着方法的调用而存在,一旦方法调用结束,局部变量也就消亡了。4.4 构造方法 构造方法的功能是在创建对象时初始化对象的实例变量; 讨论:构造方法的特点: 无返回值,无void 方法名与类名相同 仅在创建对象时调用 class point { // 程序4-3 int x, y;point(int a, int b){ x=a;y=b;} } public class createPoint { public static void main(String args[ ]){ point p= new point(10,20); System.out.println(p.x +“ ”+p.y);} } 如果类中没有定义构造方法,编译器会自动创建一个缺省的、不带参数的构造方法。构造方法是在对象创建之后,new操作完成前被调用的。4.5 方法重载 方法重载是在一个类中定义二个或多个同名的方法,但方法的参数个数或类型不完全相同;例如: class point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;} point(double a, int b){ x=(double)a;y=b;} } 方法重载的一个误区:是靠返回值区别重载,即定义多个方法,它们的名称和形参类型完全相同,但返回值不同,这是不允许的; 4.6 关键字this this指代对象,是对当前对象的一个引用。例如: class IntVector { // 程序4-6 int v[ ]; boolean equals(IntVector other){ if(this == other)return true; return false;} } class testIntVector { / 87 大理学院课程教案(教学内容) public static void main(String args[ ]){ IntVector t1=new IntVector(),t3=new IntVector(),t2=t1; System.out.println(t1.equals(t2)); System.out.println(t3.equals(t2)); } } Java中的级连调用,仍是指代当前对象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*; class time{ private int hour, min, sec; time(){ setHour(0);setMin(0);setSec(0);} time setHour(int h){ hour=((h>=0 && h<24)? h: 0); return this;} time setMin(int m){ min=((m>=0 && m<60)? m: 0); return this;} time setSec(int s){ sec=((s>=0 && s<60)? s: 0); return this;} String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{ private time t; public void init(){ t=new time();} public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20); / 87 } 大理学院课程教案(教学内容) g.drawString(“ time:”+t.tostring(),25,45);} } 在构造方法内部使用this,它用于指代另外一个构造方法,但不能指代非构造方法。例如: class point { int x, y; point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;} } 4.7 继承 继承是软件重用的一种形式,可以提高系统的性能; 继承语法: class className extends superClassName{ 各实例变量和方法的定义 } 例如: class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} point(){ this.x=0; this.y=0;} } class circle extends point{ int radius; circle(int r, int x, int y){ radius=r; this.x=x; this.y=y; } } Java不支持多继承,但支持多接口; 子类的对象也是其超类的对象,反之未必; 继承具有传递性: B继承于A,C又继承于B,则C也继承了A中的实例变量和方法。关键字super 构造方法是一种特殊的方法,子类不能继承超类的构造方法,但子类构造方法可以通过super调用超类的构造方法。 当创建子类对象时,首先执行超类构造方法,然后执行子类的构造方法。例如: class point{ // 程序4-8 int x, y; point(int x, int y){ / 87 大理学院课程教案(教学内容) this.x=x;this.y=y; System.out.println(“父类构造函数被调用!”); } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; System.out.println(“子类构造函数被调用!”); } } public class testInherence { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); } } 再次讨论构造方法 若父类没有定义构造方法,那么对父类数据的初始化将采用系统缺省的构造方法;例如: class point{ int x, y; } class circle extends point{ int radius; circle(int r, int x, int y){ this.x=x; this.y=y; radius=r; } } 若父类定义有缺省构造方法,那么子类可根据自己的需要设置自己的构造方法。例如: class point{ int x, y; point(){ this(0,0); } point(int x, int y){ this.x=x;this.y=y; } } class circle extends point{ // 注意子类的构造函数 int radius; circle(int r, int x, int y){ radius=r;} } 若父类定义的构造方法都是有参的,那么子类构造方法必须通过super调用父类构造方法,class point{ private int x, y; point(int x, int y){ / 87 大理学院课程教案(教学内容) this.x=x; this.y=y; } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; } } 4.8 方法的覆盖 方法的覆盖发生在父类和子类之间,若子类中定义的某个方法的特征,与父类中定义的某个方法的特征完全一样,那么就说子类中的这个方法覆盖了父类对应的那个方法。4.8.1 覆盖与重载的区别 重载可以出现在一个类中,也可以出现在父类与子类的继承关系中,并且重载方法的特征一定不完全相同。 覆盖特点:子类中的方法特征与父类定义的对应方法的特征完全一样。例如: // 程序4-9 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){super(x, y); radius=r; } double area(){ return Math.PI*radius*radius;} } public class testOverWrite { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); System.out.println(c1.area()); } } 4.8.2 方法的动态调用 Java的所有对象运行时都有一个类型标识(RTTI:Run-Time Type Identification),该标识记录了每个对象所属于的类。Java用此标识在运行时选择正确的方法。例如: // 程序4-11 / 87 大理学院课程教案(教学内容) class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r;} double area(){ // 覆盖了父类的area方法 return Math.PI*radius*radius; } } public class dynamicalCall { public static void main(String args[ ]){ point p[ ]={new point(2,2), new circle(1,1,1)}; for(int i=0;i System.out.print(“类名: ”+ p[i].getClass().getName()); System.out.print(“父类:”+ p[i].getClass().getSuperclass()); System.out.println(“ 面积: ”+ p[i].area()); } } } 子类对象调用方法时: (1)子类检查是否具有同名和同参数类型的方法,若有则调用该方法,否则继续执行。 (2)到父类中寻找同名和同参数类型的方法,若有则调用该方法。若找不到,将产生编译错误。 对象决定自己到底该调用哪个方法,取决于该对象在继承链中的位置。 4.9 多态性不适合继承链中的实例变量 引用.方法:根据多态性调用; 引用.实例变量:根据引用的类型调用。即:多态性仅仅适用于方法的调用,而不适合实例变量。例如: class Base{ // 程序4-12 int x=1;void print(){ System.out.println(“当前类为 ”+ this.getClass().getName()); / 87 大理学院课程教案(教学内容) System.out.println(“对象的x= ”+this.x); } } class Derived extends Base{ int x=2;void print(){ System.out.println(“当前类为 ”+ this.getClass().getName()); System.out.println(“对象的x= ”+this.x); } } public class confusions{ public static void main(String [ ] args){ Base obj=new Derived(); obj.print(); System.out.println(“对象的x= ”+obj.x); } } 4.10 finalize Java的垃圾回收器具有自动回收垃圾的能力。 垃圾回收器是一个优先级比较低的线程,在系统空闲时运行。 在对象被回收之前,有时需要执行一些特殊的操作,例如保存文件、清除屏幕等,这时就要用Java的finalize方法。例如: class point{ // 程序4-13 int x, y; point(int a, int b){ x=a;y=b; System.out.println(“point constructor:”+getString()); } public void finalize(){ // 注意该方法 System.out.println(“point finalizer:”+getString()); } String getString(){ return “x=”+x+“ y=”+y; } } class circle extends point{ int radius; / 87 大理学院课程教案(教学内容) circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString()); } public void finalize(){ System.out.println(“circle finalizer:”+getString()); } String getString(){ return super.getString()+“ radius=”+radius; } } public class testFinalize { public static void main(String args[ ]){ point c1,c2;c1=new circle(1,1,1); c2=new circle(2,2,2); c1=null; c2=null;System.gc(); } } 4.11 static static修饰变量(与C中的不同); static修饰方法(与C中的不同); 4.11.1 static变量 static变量是指这样的成员变量:不管在程序运行中生成多少个该类的对象,它们都共享该变量。即使没有创建对象,该变量仍然存在。因此,static变量又称为类变量。定义格式为:static type variableName; static变量和一般的实例变量不同,在构造方法中不能对它进行初始化。例如: class point{ // 程序4-14 static int count;int x, y; static{ // 静态初始化块 count=0; System.out.println(“static variable is initialized!”); } point(int a, int b){ / 87 大理学院课程教案(教学内容) count++; x=a; y=b; System.out.println(“Call point constructor!”);} } public class testStaticVariable { public static void main(String args[ ]){ point c1=new point(0,0); System.out.println(“There are ”+ point.count +“ points”); } } 4.11.2 static方法 (可举例说明Math类的PI和sqrt等,为什么要用静态变量。)static方法是类中的成员方法,它属于整个类,即使不创建任何对象,也可使用静态方法。调用静态方法格式:类名.方法名(参数); 在子类中不能覆盖父类中定义的静态方法。 静态方法中只能出现静态变量和其它静态方法。并且还不能使用this和super。例如: class point{ // 程序4-15 static int count;// 定义静态变量 int x, y; static{ count=0;System.out.println(“static variable is initialized!”); } point(int a, int b){ count++; x=a;y=b; System.out.println(“Call point constructor!”); } static int getCount(){ // 静态方法 return count; } } public class testStaticMethod { public static void main(String args[ ]){ point c1=new point(0,0);point c2=new point(1,1); System.out.println(“There are ”+ point.getCount()+“ points”);} / 87 大理学院课程教案(教学内容) } 4.12 关键字final 在实例变量、局部变量和方法的形参定义之前加上final,那么这个变量值只能被引用,而不能修改。 final修饰的局部变量和实例变量必须给出初值,因为它修饰的变量代表一个常量。例如: class Base{ // 程序4-16 final int x=1; // 形式1:修饰实例变量 void print(final int y){ // 形式2:修饰参数 // y=0; // 错误 System.out.println(x+y); } } public class finalVariables{ public static void main(String [ ] args){ final int var=100;// 形式3:修饰局部变量 Base obj=new Base(); obj.print(var);} } 在方法定义前加上final,该方法就不能被子类覆盖,成为终极方法 ; 包含终极方法的类仍然可以被子类继承,子类虽然不能覆盖父类中的终极方法,但可以重载该方法。例如: class Base{ final int x=1; final void print(int y){ // 父类中的final方法 System.out.println(x+y); } } class Derived extends Base { void print(){ // 重载了父类中的print方法 System.out.println(x); } } 4.12.3 final类 在一个类定义前加上final,意味着这个类就不能被其它类继承,成为终极类。 系统类基本上都是final类,如String类。 / 87 大理学院课程教案(教学内容) 将class定义为final是为了杜绝继承,类中的方法自然都变成了终极方法。例如: final class Base{ // 声明为final类 final int x=1; void print(final int y){ System.out.println(x+y); } } // 错误:不能继承final 修饰的Base类 class Derived extends Base { } 4.13 组合与继承 面向对象中的软件重用表现为两种形式:继承和对象组合。 设计这类程序的关键是构造方法:子类构造方法调用父类构造、成员对象的初始化。class date{ // 程序4-17 int year, mon,day; date(int y, int m, int d){ year=y; mon=(m>0 && m<13)?m:1;day=checkday(d); } int checkday(int d){ int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(d>0 && d<=daydisp[mon]) return d; if(mon==2 && d==29 &&(year%400==0 || year%4==0&& year%100!=0)) return d; return 1; } String tostring(){ return year+“/”+mon+“/”+day;} } class employee{ // 雇员类 long id;date birthday; employee(long no, int year, int mon, int day){ id=no; // 设置组合对象 birthday=new date(year,mon,day);} / 87 例如: 大理学院课程教案(教学内容) String tostring(){ return id+“ , ”+birthday.tostring();} } class manager extends employee { // 经理类 double basePay; manager(long no, int y, int m, int d){ super(no,y,m,d); // 调用父类构造函数 basePay=1000;} String tostring(){ return basePay+“ , ”+super.tostring();} } public class compositionAndInherence { public static void main(String [ ] args){ manager boss; boss=new manager(1001,1971,11,5); System.out.println(boss.tostring()); } } 4.14 抽象类和抽象方法 抽象方法:仅有方法特征,但没有代码; 抽象类:包含抽象方法的类。 抽象类的作用:提供一种适当的超类,子类通过继承实现父类中的抽象方法。 抽象类不能用final修饰。 抽象类体现了多态性,通过继承可以从抽象类派生出具有相似操作的子类。例如: abstract instrument abstract void play()继承 wind void play()继承 继承 stringed void play()percussion void play()继承 继承 woodwind void play()brass void play() // 程序4-18 / 87 大理学院课程教案(教学内容) abstract class instrument{ abstract void play();// 抽象方法 } // wind不是抽象类 class wind extends instrument{ void play(){ System.out.println(“wind play!”);} } // percussion也不是抽象类 class percussion extends instrument{ void play(){ System.out.println(“percussion play!”);} } // stringed也不是抽象类 class stringed extends instrument{ void play(){ System.out.println(“stringed play!”);} } class woodWind extends wind{ // 覆盖父类中的play方法 void play(){System.out.println(“woodWind play!”);} } class brass extends wind{ // 覆盖了父类中的play方法 void play(){ System.out.println(“brass play!”);} } public class music { static void tuneAll(instrument e[ ]){ for(int i=0;i e[i].play();} public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5]; int i=0; orchestra[i++]=new wind(); orchestra[i++]=new percussion(); orchestra[i++]=new stringed(); orchestra[i++]=new woodWind(); orchestra[i++]=new brass(); tuneAll(orchestra); } } 程序运行结果: wind play!percussion play! / 87 大理学院课程教案(教学内容) stringed play!woodWind play!brass play! 4.15 对象的类型转换 4.15.1 向上类型转换 从子类向父类转换,在继承图中是向上移动,通常称为向上类型转换。类型向上转换是安全的,因为这是从特殊类型到通用类型的转换。 进行向上类型转换时,出现的唯一问题是可能丢失子类中定义的方法和变量。例如: // 程序4-19 class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} int getX(){ return x;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y);radius=r;} double area(){ return Math.PI*radius*radius; } } public class testUpCasting { public static void main(String [ ] args){ circle c=new circle(1,1,1); point p=c;// 注意:p和c的类型不同 } System.out.println(p.getX()); } 4.15.2 向下类型转换 从父类向子类转换,在继承图中是向下移动,称为向下类型转换。 类型向下转换是不安全的,因为这是从一般类型到特殊类型的转换。例如: public static void main(String [ ] args){ point p=new point(1,1);circle c;c=p; //注意:此处编译时出错 c=(circle)p;//注意:此处运行时出错 System.out.println(c.area()); } / 87 大理学院课程教案(教学内容) 4.16 访问权限限制 Java提供的访问权限修饰符有四个,即public、private、protected和友元; 修饰符要置于每个类成员(实例变量和成员方法)的定义之前,且仅能控制它所修饰的那个成员。4.16.1 友员 缺省修饰符的情况就是友员。友员修饰符意味着同一个目录(包)中的所有类都可以访问这种类型的成员。 friendly不属于Java关键字,是C++的一个关键字。 例如: public class Base{ // 该类位于Base.java文件中 int friend_data=1;// 友员数据成员 } // 该类位于Derived.java文件中 public class Derived extends Base{ Base p=new Base(); // 访问Base类中的friend_data void dataUse(){ System.out.println(“data=”+p.friend_data); } } 4.16.2 public 成员 不管两个类是否位于同一个目录中,一个类总可以访问另一个类的public成员。 public还可以用于修饰主类,文件名必须与主类名一致。除此之外,其它3个修饰符都不能用于修饰类,只能修饰成员。例如: public class Base{ public int friend_data=1;// public成员 } public class Derived extends Base{ public Base p=new Base(); public void dataUse(){ System.out.println(“data=”+p.friend_data); } } 4.16.3 private成员 private成员的特性:除了其所在类能够访问该成员以外,其它类都不能访问它。 在多人合作开发一个系统的过程中,private可以让你自由使用自己定义的成员,无须担心与其他人 / 87 大理学院课程教案(教学内容) 写的类相冲突。例如: // 程序4-20 class Base{ private Base(){ } // 注意 static Base makeBase(){ return new Base();} } public class testPrivate { public static void main(String args[ ]){ // Base p=new Base(); // 编译有错 Base p = Base.makeBase();} } 4.16.4 protected成员 protected与继承有关,这种类型的成员可以被子类访问。 同一个包内的非子类,也可以访问这种类型的成员。即:protected天生就具有友元权限,例如: // 程序4-21 class Base{ // 该类位于Base.java文件中 int friend_data=1; // 友元成员 public int public_data=2;// public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } class Derived extends Base{ // Derived.java文件 Base a=new Base(); void dataUse(){ System.out.println(a.friend_data); System.out.println(a.public_data); // System.out.println(a.private_data); System.out.println(a.protected_data);} } // 将主类存放在testData.java文件中 public class testData { public static void main(String args[ ]){ Derived d=new Derived(); d.dataUse(); } } 访问权限总结 / 87 大理学院课程教案(教学内容) 课堂练习: 1、定义一个Student类: 该类的功能有:可以保存、修改和获取学生的姓名、学号等。可以设置学生的英语成绩、数学成绩、Java成绩,并能计算平均分、最高分和最低分。 2、以下代码定义了一个类,请指出其中三条不合法的代码行(行号参见注释)。 class Test22{ //1 float u; //2 static float v; //3 static void setUV(boolean f){ //4 u=fac1(f); //5 v=fac2(!f); //6 } //7 static float fac1(boolean f){ return f?u:v;} //8 float fac2(boolean f){ return f?u:v;} //9 } 课外练习(作业): P87 1、3、4、6 第5章 接口和包 教学目的要求 掌握接口的定义和使用 了解接口与抽象类的异同点 掌握包的定义和使用 主要内容 接口的定义和使用 包的定义和使用 重点内容 接口的定义和使用 包的定义和使用 难点内容 无 课时分配 / 87 大理学院课程教案(教学内容) 1课时 教学方法 讲授法、演示法 讲授内容提要 5.1 接口 引入接口的原因:在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。5.1.1 接口的定义和应用 接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何实现这些方法。 Java允许一个类同时实现多个接口,相当于实现多继承的功能。声明一个接口的语法格式: [public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName(Parameter lists);} 例如: interface Sortable{ // 定义一个接口 int Compare(Sortable s);} 接口中不能声明任何变量和构造方法。 如果一个类实现多个接口,应该在接口名之间用逗号隔开。 当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。例如: // 程序5-1 interface Sortable{ // 定义一个接口 int Compare(Sortable s);} class Sort{ // 定义一个排序类,仅有一个静态的方法 public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable temp; for(i=0;i // 选择排序 k=i; for(j=i+1;j if(a[k].Compare(a[j])<0)k=j; temp=a[i];a[i]=a[k];a[k]=temp;} } } class Student implements Sortable{ // 定义一个学生类 private int score; / 87 大理学院课程教案(教学内容) Student(int x){ score=x;} // 实现接口Sortable中的方法 public int Compare(Sortable s){ Student st=(Student)s; // 类型强制转换 return score-st.score; } public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形类也实现了接口 private int length,width; Rectangle(int x,int y){ length=x;width=y;} int area(){return length*width;} public int Compare(Sortable s){ // 实现接口 Rectangle rec=(Rectangle)s; // 类型强制转换 return area()-rec.area(); } public String toString(){ return “area=”+area();} } public class interfaceTest { public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i; for(i=0;i stud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud); // 排序 for(i=0;i System.out.println(stud[i].toString()); Rectangle R[ ]=new Rectangle[10]; for(i=0;i R[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R); // 排序 for(i=0;i System.out.println(R[i].toString()); / 87 大理学院课程教案(教学内容) } } 接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用这些常量。例如: // 程序5-2的部分 interface constant { int EXCELLENT=5;int GOOD=4;int PASS=3;int FAIL=2;} 在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致; 实现方法时必须在方法前加上public; 若一个类没有对接口中的方法具体实现,那么必须将该类声明为abstract类。例如: interface inter { // 接口 void methodA();} abstract class Derived1 implements inter { // 此处不需要写出methodA()的原型 } class Derived2 extends Derived1{ public void methodA(){ // 实现方法 System.out.println(“Hi,methodA”); } } 5.1.2 接口和抽象类的异同点 接口和抽象类的相同点: (1)都有空的方法,都必须在子类中实现这些方法。 (2)都不能用new关键字来创建这两种类型的对象。 (3)都可以具有继承关系。 (4)接口和类一样可以具有public属性。接口和抽象类的不同点: (1)在抽象类中,空的方法必须加abstract关键字,而在接口中不需要。 (2)在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法。 (3)接口允许多继承,类仅支持单继承。 5.2 包 在Java中可以将自己写的类,按一定的方法归属于不同的子目录中(包)。 在缺省情况下,Java将所有的类归属一个缺省包中。在不同的包中可以有同名的类存在。 / 87 大理学院课程教案(教学内容) Java中的包与C++中的名字空间相似。5.2.1 package语句 package语句告诉编译器当前类属于哪个包。如果没有package语句,类就存放在无名的缺省包中(即当前目录中)。 引进包的概念主要是为了名字冲突。 格式: package pkgl[.pkg2[.pkg3]]; 5.2.2 import语句 import语句位于package语句之后,类的定义之前;格式:import package1[.package2].(class-name | *); 采用*号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。5.2.3 包应用举例 package Base; // 将该类存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成员 public int public_data=2;// public成员 private int private_data=3;// private成员 protected int protected_data=4;// protected成员 } package Derived; // 将Base类存放在Derived包中 import Base.*;// 需要使用Base包中的类 public class Derived extends Base{ Base a=new Base(); // 为了让testData类能调用该方法,修改为public public void dataUse(){ // System.out.println(a.friend_data); // 不能访问 System.out.println(a.public_data); // System.out.println(a.private_data); // 不能访问 // System.out.println(a.protected_data);// 不能访问 } } // testData.java文件的内容如下: import Derived.*; //需要使用Derived包中的类 // 该类位于工作目录,不需要package语句 public class testData { public static void main(String args[ ]){ Derived d=new Derived(); d.dataUse(); } } / 87 大理学院课程教案(教学内容) 课堂练习: 课外练习(作业): P108 3~6 第6章 字符串处理 教学目的要求 掌握字符串的分类; 掌握内容不可改变的字符串类String; 掌握字符串常量; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 主要内容 字符串的分类; 内容不可改变的字符串类String; 字符串常量; 内容可以改变的字符串类StringBuffer; 字符串应用。 重点内容 掌握内容不可改变的字符串类String; 掌握内容可以改变的字符串类StringBuffer; 掌握字符串应用。 难点内容 String和StringBuffer的区别和联系 课时分配 2课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 6.1 字符串的分类 java.lang包中定义了 String和StringBuffer两个类; 在运行中值不会改变的字符串,用String类存储;值会改变的字符串用StringBuffer类来存储。两个类都有final修饰,这样可以优化字符串的操作。 6.2 String类 String类的定义原型 : public final class java.lang.String extends java.lang.Object { … } 6.2.1 字符串常量 / 87 大理学院课程教案(教学内容) 字符串常量属于String类型;相同的字符串常量属于同一个对象,占用同一块空间,例如: // 程序6-1 public class TestConstString{ public static void main(String args[ ]){ String str1=“Hello”, str2=“Hello”; System.out.println(str1==str2); System.out.println(“Java”==“Java”);} } 6.2.2 创建String类对象 用new运算符,并调用构造函数创建这种类型的对象,常见构造函数如下: 1.public String()采用该构造函数创建一个不含字符的空对象。例如: String str =new String(); 2.public String(char value[ ]) 将字符数组的内容转换为字符串,并赋予新建的对象。例如: char a[ ]={'J','a','v','a'}; String str=new String(a);3.public String(char value[ ], int offset, int count) 例如:char a[ ]={'J','a','v','a'}; String str=new String(a,1,2); // 字符串str的内容是“av” 4.public String(String value) 采用value对象的值构造一个新的string对象。 例如: String str1=“Java”; String str2=new String(“Java”); System.out.println(str2); System.out.println(str1==str2); 5.public String(StringBuffer Buffer)注意采用字符串常量初始化一个String引用的问题。例如: String str = “abc”;相当于: char data[ ] = {'a', 'b', 'c'};String str = new String(data);应用举例,注意程序6-2的输出结果: public class TestString{ // 程序6-2 public static void main(String args[ ]){ String s1=“Java”, s2=“Java”; String s3=new String(s1); System.out.println(“ s1==s2 is ”+(s1==s2)); / 87 大理学院课程教案(教学内容) System.out.println(“ s1==s3 is ”+(s1==s3)); s1=“ABC”; s2=“DEFG”; System.out.println(“ s1==s2 is ”+(s1==s2)); s1=s2; System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3 String类常用方法 1.public int length(): 求串长。例如: String str=“Java” ; System.out.println(str.length());2.public char charAt(int index) 提取指定位置上的字符。 3.public int compareTo(String anotherString) 对字符串内容按字典序进行大小比较。例如: public class SortStringArrary{ // 程序6-3 public static void main(String args[ ]){ String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”};int i,j,k; System.out.print(“排序之前:”);for(i=0;i System.out.print(“t”+s[i]);for(i=0;i for(k=i,j=i+1;j if(s[k].compareTo(s[j])>0) k=j; str=s[i]; s[i]=s[k]; s[k]=str;// 注意该行的含义 } System.out.print(“n排序之后:”);for(i=0;i System.out.print(“t”+s[i]); } } 4.char[ ] toCharArray() 将String对象转换到一个字符数组中,例如: String s=“Hello,Java!”; char a[ ]; a=s.toCharArray(); for(int i=6;i System.out.print(a[i]);5.public boolean equals(String anString) 比较两个字符串对象的内容是否相等。 / 87 大理学院课程教案(教学内容) 6.public boolean equalsIgnoreCase(String anotherString) 以忽略大小写方式,比较两个字符串对象的内容是否相等。 注意:equals()方法与“==” 之间的区别。例如: public class ConfuseQuestion{ // 程序6-5 public static void main(String args[ ]){ String s1=“java”; String s2=new String(s1); String s3=s2; System.out.println(s1.equals(s2)); System.out.println(s2.equals(s3)); System.out.println(s2==s3); System.out.println(s2.equals(s3));} } 7.public int indexOf(int ch / String str) 在字符串中搜索字符或子串,返回字符或子串在String对象中从左边起首次出现的位置。如果没有出现,返回-1。 8.public String substring(int begin, int end) 提取string对象中从begin开始,到end-1结束的子串,返回提取的子串。 9.public String concat(String str)将str对象接到调用对象的后面,返回新串。例如: String s1=“Hello ” , s2=“Java” , s3; s3=s1.concat(s2); System.out.println(s3);注意:如果参数str为空(null),则concat方法不创建新串,而仅仅返回当前串,10.public String replace(char oldChar, char newChar) 将String对象中所有的oldChar字符替换为newChar,返回替换后的新串。例如: String path=“d:/myjava/documents”; System.out.println(path.replace('/' , '')); public String toString() 返回当前字符串对象本身。 12.public static String valueOf(各种类型 f) 将各种数据类型转换成一个相应的字符串表示,该方法是一个static方法。 程序6-6演示了valueOf()方法的应用。 程序6-7自学。 public class TestValueOf{ // 程序6-6 public static void main(String args[ ]){ char a[ ]={'A','B','C','D','E','F'}; int i=123456; float f=3.14159f; boolean b=true; Object o=null; / 87 大理学院课程教案(教学内容) System.out.println(String.valueOf(a)); System.out.println(String.valueOf(a,2,3)); System.out.println(String.valueOf(i)); System.out.println(String.valueOf(f)); System.out.println(String.valueOf(b)); System.out.println(String.valueOf(o));} } 6.2.4 Java应用程序的命令行参数 应用程序可以通过main方法的String数组,访问由解释器传递的命令行参数。例如: public class ShowMainArguments{ //程序6-8 public static void main(String args[ ]){ for(int i = 0;i < args.length;i++) System.out.println(args[ i ]); } } 6.3 StringBuffer类 StringBuffer类对象是一个内容可以改变的字符串。可以减少由于少量字符的插人而引起的空间分配问题。 StringBuffer类的原型: public final class java.lang.StringBuffer extends java.lang.Object { … } StringBuffer类对象有一块缓冲区,字符串被存放在缓冲区中,缓冲区的大小可以随程序的需要进行调整。缓冲区的大小称为对象的容量。 当修改对象的内容时,只要StringBuffer对象包含的字符个数没有超出容量,就不会分配新的空间,而直接在原空间内进行修改。若字符的个数超出了容量,该对象会自动调整其容量,从而适应新的存储。 6.3.1 创建StringBuffer类对象 StringBuffer类的构造函数有三种方式: 1.public StringBuffer()创建一个内容为空的StringBuffer对象,容量为16。 例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始内容为空,容量为length指定的大小。注意:length应大于等于0,不能为负数,否则会产生异常。例如: StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str) 初始内容和参数str的内容相同,容量为参数str的长度加上16。例如: String s1=“Java”; StringBuffer s2=new StringBuffer(s1);则s2的容量是20,内容是“Java”。 / 87 大理学院课程教案(教学内容) 6.3.2 StringBuffer类常用方法 1.public int length() 返回字符串的长度 2.public int capacity() 返回缓冲区大小 3.public void setLength(int newLength) 指定对象的长度,将对象的内容进行裁减。如果参数小于对象的长度,则将对象截断;如果参数大于等于对象的长度,则填充空字符('u0')扩充新增加的部分。4.public void ensureCapacity(int NewCapacity) 设定对象的缓冲区的大小,若参数 小于对象的容量,则新的设置将不起作用,也就是说容量只能扩大而不能缩小。 程序6-9演示了这几个方法的具体应用。 public class TestCapacity{ // 程序6-9 public static void main(String args[ ]){ String s=“Java”;StringBuffer str=new StringBuffer(s); System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8); // 设置长度为8 str.ensureCapacity(80);// 设置容量为80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); str.setLength(3); str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); } } 5.public void setCharAt(int index, char ch) 将参数index指定位置上的字符,设置成参数ch 指定的字符。例如: StringBuffer str=new StringBuffer(“Hello,Java”); str.setCharAt(3,'L'); 则str的内容变成了“HelLo,Java” 6.public StringBuffer append(多种数据类型) 将其它类型的数据添加到StringBuffer对象的尾部,返回修改后的StringBuffer对象。 例如:StringBuffer s1,s2=new StringBuffer(); s1=s2; // s1和s2代表同一个对象 s2.append(3.14).append(' ').append(“Java”); / 87 大理学院课程教案(教学内容) System.out.println(s1==s2); // 输出true System.out.println(s1); // 输出3.14 Java 7.public String toString() 该方法把StringBuffer对象的内容复制到一个新的String类对象中,返回这个新的String类对象。例如程序6-10。 public class BufferToString{ // 程序6-10 public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”); s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2); } } 8.public StringBuffer insert(int offset, 多种类型 b)该方法是将一个其它类型的对象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“); // 将字符串”Hello“插入到下标为0的位置 str.insert(0,”Hello“); System.out.println(”str= “+str);输出结果为: str= Hello Java! 6.4 应用举例 略 课堂练习: 无 课外练习(作业): P119 2、3、4 第7章 异常处理 教学目的要求 了解异常的层次结构; 掌握异常处理语句; 了解自定义异常; 了解异常处理中常用的调试方法。 主要内容 异常的层次结构; 异常处理语句; 自定义异常; 异常处理中常用的调试方法。 / 87 大理学院课程教案(教学内容) 重点内容 异常处理语句; 难点内容 无 课时分配 1课时 教学方法 讲授法、演示法、对比法、实验验证法 讲授内容提要 7.1 异常的层次结构 Throwable是异常类的根节点,定义在java.lang包,它的子类也定义在该包中; Error代表系统错误类,由系统直接处理; Exception类及其子类是在程序中可捕捉到的异常。见图7.1 Throwable Error … AWTError LinkageError VirtualMachineError RuntimeException ArithmeticException ArrayIndexOutOfBoundsException … Interrupted Exception FileNotFoundException… EOFException AWTException IOException Exception 1.java.lang.ArithmeticException 0作除数(包括模),将产生这类异常。例如:int x=0 , y; y=100/x; 2.java.lang.ArrayIndexOutOfBoundsException 例如:int a[ ]=new int[10]; a[10]=0; 3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10]; boolean b[ ]=new boolean[10]; System.arraycopy(a,0,b,3,6);//有异常 4.java.lang.ClassCastException 例如: Object obj=new Object(); int a[ ]=(int[ ])(obj); 5.java.lang.IndexOutOfBoundsException 例如:char ch=”ABC“.charAt(99); / 87 大理学院课程教案(教学内容) 注意: 2 是5的子类。 6.java.lang.NegativeArraySizeException 例如: int a[ ]=new int[-10]; 7.java.lang.NullPointerException 例如:int a[ ]=null; System.out.print(a.length);7.2 异常处理语句 缺省的异常处理的情况,例如: public class DefaultException{ // 程序7-1 public static void main(String args[ ]){ int a,b=0; a=2/b; // 此处有异常 System.out.println(“a=”+a);// 不运行此行 } } 异常处理语句有try、catch、finally、throw和throws。异常处理的形式为: try{ 程序执行体 }catch(异常类型1 异常对象1){ 异常处理程序体1 }catch(异常类型2 异常对象2){ 异常处理程序体2 }finally { 异常处理结束前的执行程序体 } 7.2.1 try和catch语句 try语句指明可能产生异常的代码段;catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。异常处理以后,程序从try语句代码段后继续执行。例如:程序7-2。public class TryCatchTest{ // 程序7-2 public static void main(String args[ ]){ int a=99,b=0,c; try{ System.out.println(”产生异常之前“); c=a/b; // 该行有异常 System.out.println(”产生异常之后“);}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理下标越界异常“);}catch(ArithmeticException e){ System.out.println(”处理算术异常“);} System.out.println(”异常处理结束“); / 87 大理学院课程教案(教学内容) } } 注意:用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理。例如: int a=99,b=0,c; try{ c=a/b;//产生的异常和捕捉的异常类型不一致 }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”处理异常“); } 注意:当有多个catch语句时,系统依照先后顺序逐个检查。例如: try{ c=a/b; }catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){ System.out.println(”Divided by zero“);} 7.2.2 finally语句 无论是否产生异常,finally语句指明的代码一定被执行。例如: public class testFinally{ // 程序7-3 public static void main(String args[ ]){ int a,b=0; for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{ switch(i){ case 0: a=3/b; break; case 1: int c[ ]=new int[10]; c[10]=0; break; case 2: char ch=”ABC“.charAt(99); break; case 3: return; } }catch(ArithmeticException e){ System.out.println(“零作除数!”); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”数组下标越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下标越界!“);}finally{ / 87 大理学院课程教案(教学内容) System.out.println(”在finally块中!“);} } } } 7.2.3 throw语句 throw语句用于指出当前行有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。 throw语句可以将异常对象提交给调用者,以进行再次处理。例如:程序7-4。public class ThrowException{ // 程序7-4 public static void Test(){ try{ int c[ ]=new int[10]; c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 数组下标越界!“); throw e; // 异常抛出点 //System.out.println(“t产生异常后!”); 该行无法通过编译 } } public static void main(String args[ ]){ try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下标越界!“);}finally{ System.out.println(”t 在finally块中!“); } } } 7.2.4 throws语句 throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。例如: import java.io.*; // 程序7-6 public class testThrows { public static String readString()throws IOException{ int ch; String r=”"; boolean done=false; while(!done){ ch=System.in.read(); if(ch<0 || ch==0xd) done=true; / 87 Java使用教材: 程序设计课程教案(普通版) Java程序设计教程,雍俊海主编,清华大学出版社,2007,国家十一五规划教材 主要参考书: 《Java语言程序设计》,郎波,清华大学出版社,2005年5月。《Java程序设计教程》,施霞萍等.机械工业出版社,2006 《Java编程思想第3版》,[美]埃克尔(Eckel,B.)著,陈昊鹏等译.机械工业出版社,2005J 《JAVA软件开发(第二版)》,Russel Winder&Graham Roberts著,窦巍 译,人民邮电出版社,2004.2 课程总体目标 本课程是软件工程专业开设的学科基础课。本课程的教学任务是通过Java程序设计的课堂讲授、课内实验,课外自主试验等教学环节,培养学生程序设计使用Java语言进行程序设计的基本能力,并且养成学生良好的编程习惯和规范的编程风格。使学生掌握较扎实的 Java 语言基础,理解面向对象程序设计的思想,为Java后续课程的学习打下坚实的基础。 课程的主要内容如下: 1、绪论 2、Java程序设计基础 3、Java面向对象程序设计 4、数组、字符串、向量和哈希表 5、泛型、枚举与for语句的简化写法 6、Java异常处理与递归 7、文件与数据流 8、Java图形用户界面程序设计 9、多线程程序设计 10、网络程序设计 第1章 绪论 一、教学目的和要求 了解Java语言的发展历史,Java语言的特点,学会安装配置Java开发环境,能够编译和运行Java程序。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 Java语言的发展历史 Java语言的特点 Java开发环境的安装与配置 Java程序开发过程以及命令行状态下编译与运行过程介绍 2、教学重点 Java语言的特点,开发环境配置,编译运行方法 3、教学难点 理解Java程序为什么能够一次编译到处运行;为什么要配置Path环境变量;编译与运行的注意事项。 4、解决办法 原理讲解,操作演示 5、学时分配 发展历史:0.5课时 Java语言的特点:0.5课时 Java开发环境的安装与配置:0.5课时 Java程序开发过程以及命令行状态下编译与运行过程介绍:0.5课时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,运行环境配置,编译运行Java程序则现场操作演示。 四、课外学习要求和作业要求 课外作业:要求下载JDK,自行安装配置并编译运行HelloWorld.java程序 第2章 Java程序设计基础 一、教学目的和要求 了解Java中数据的类型,表示方法,变量的声明,掌握使用标识符命名Java中各种成分的规定和规范;正确掌握表达式的书写方法;能够使用各种控制结构实现程序的逻辑;掌握结构化程序设计的思想和算法描述工具的使用。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 标识符和关键字 基本数据类型 常量和变量 数据类型转换 运算符:算术运算符、关系运算符、布尔逻辑运算符、位运算符、赋值类运算符、条件运算符等 表达式 程序流程控制语句:if和switch语句;for、while、do~while循环语句;break、Continue和return语句 结构化程序设计 2、教学重点 基本数据类型和类型转换,常量和变量,运算符与表达式,程序流程控制语句。 3、教学难点 数据类型转换;前缀自增、自减运算符与后缀自增、自减运算符的区别;程序流程控制语句。分支语句的嵌套;循环语句的嵌套;标号的概念与使用。 4、解决办法 原理讲解,操作演示 5、学时分配 标识符和关键字,基本数据类型,常量和变量:2学时 数据类型转换,运算符,表达式:1学时 程序流程控制语句,break、Continue和return语句:2学时 结构化程序设计:1学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。要求学会使用算法描述工具表示和设计程序的算法。 第3章 面向对象程序设计 一、教学目的和要求 了解面向对象程序设计基本思想,掌握类的设计方法、实例对象的创建与使用。了解变量作用域范围与参数传递方式。了解并能运用Java中面向对象的封装性、继承性、多态性; 掌握访问权限的控制方法,修饰词abstract、static和final的使用;掌握包、抽象类、接口、内部类的概念和使用方法。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 类和对象的基本概念。面向对象程序设计基本思想。 类的设计、构造方法、类的成员变量和成员方法。实例对象的创建与使用。 变量作用域范围与参数传递方式。继承性。 多态性:静态多态性和动态多态性。封装性和访问权限控制。 修饰词abstract、static和final。包的概念和使用 抽象类和接口。内部类。 2、教学重点 类的定义,对象的创建,构造方法的定义与使用,方法的重载与覆盖,类的继承,包,抽象类和接口。 3、教学难点 类与对象的概念、创建和使用;方法重载的规则;类的继承与运行时多态,类继承时对构造方法的处理问题,访问控制权限的使用;方法覆盖的规则;抽象类的应用,接口的应用;抽象类与接口的异同。 4、解决办法 原理讲解,操作演示 5、学时分配 类和对象的基本概念,面向对象程序设计基本思想:2学时 类的设计、构造方法、类的成员变量和成员方法,实例对象的创建与使用,变量作用域范围与参数传递方式:2学时 继承性,方法覆盖,多态性:静态多态性和动态多态性:2学时 封装性和访问权限控制,修饰词abstract、static和final,包的概念和使用:2学时 抽象类和接口,内部类:2学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。安排4个学时的课内上机实验。 第4章 数组、字符串、向量与哈希表 一、教学目的和要求 了解一维数据和多维数组的声明与使用,掌握遍历数组的方法,了解并能够使用字符串String的常用方法,掌握StringBuffer的用法,了解并掌握向量Vector,哈希表Hashtable、HashMap和WeakHashMap的用法。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 数组:一维数据和多维数组。字符串:String和StringBuffer。向量:Vector。 哈希表:Hashtable、HashMap和WeakHashMap。 2、教学重点 一维数组的使用,String和StringBuffer的构造方法和常见方法的使用,Vector类的使用,哈希表类的创建和使用。 3、教学难点 多维数组的声明和使用,数组的初始化方法,String和StringBuffer的使用方法的区别,哈希表类的使用。 4、解决办法 原理讲解,操作演示 5、学时分配 数组:一维数据和多维数组:1.5学时 字符串:String和StringBuffer:1学时 向量:Vector,哈希表:1.5学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。要求作业必须进行上机调试。 第5章 异常处理 一、教学目的和要求 了解异常的概念,异常类的层次结构;掌握异常的抛出、捕获和处理方法;能够自定义异常类并且使用自定义异常类。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 异常的概念。异常类的层次结构。异常的抛出、捕获和处理。自定义异常类 2、教学重点 异常的基本概念,异常的抛出捕获和处理,自定义异常类。 3、教学难点 异常的处理机制;Try-catch-finallly异常处理结构的执行流程特点;自定义异常类。 4、解决办法 原理讲解,操作演示 5、学时分配 异常的概念,异常类的层次结构:0.5学时 异常的抛出、捕获和处理:1学时 自定义异常类:0.5学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。安排一次课内上机实验。 第6章 文件与数据流 一、教学目的和要求 了解输入流与输出流的基本概念,掌握常见输入和输出流类的使用,掌握文件和随机存取文件的操作,了解读写器的使用方法,掌握对象序列化的概念。能够编写从键盘输入数据以及对磁盘文件进行读写的程序 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 输入流与输出流的基本概念。 常见输入和输出流类:InputStream和OutputStream,DataInputStream和DataOutputStream,FileInputStream和FileOutputStream,PrintStream, 带缓存的输入流和输出流。文件和随机存取文件。 读写器:Reader和Writer,FileReader和FileWriter,带缓存的读写器,PrintWriter。 对象序列化。 2、教学重点 输入输出流的基本概念,文件输入流和文件输出流,文件与目录管理,随机存取文件。 3、教学难点 字节流与字符流的选用,节点流与过滤流的配合使用,随机读写文件,对象序列化。 4、解决办法 原理讲解,操作演示 5、学时分配 输入流与输出流的基本概念,常见输入和输出流类的使用,过滤流的使用:2学时 文件和随机存取文件,读写器:Reader和Writer,FileReader和FileWriter,带缓存的读写器,PrintWriter,对象序列化:2学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。安排一次课内上机实验。 第7章 图形用户界面程序设计 一、教学目的和要求 了解基本组件和容器组件,掌握主要布局管理器的概念和使用方法,掌握事件处理机制及其实现方法,了解Swing的特点和类的层次结构,Swing常见组件和容器;掌握键盘和鼠标事件处理方法,了解高级图形用户界面:菜单、树、表格和多文档界面的编程方法;掌握Java的图形程序设计。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 AWT功能和类的层次结构。(选讲)AWT的基本组件和容器组件。(选讲)布局管理器。事件处理机制。 Swing的特点和类的层次结构。Swing常见组件和容器。键盘和鼠标事件处理。 高级图形用户界面:菜单、树、表格和多文档界面。 小应用程序:Applet的基本工作原理, Applet生命周期, Applet类中的重要方法, Applet编写方法和Applet与浏览器的参数传递。(选讲)Java的图形程序设计。 2、教学重点 常用的GUI组件和容器,布局管理器,事件处理机制,菜单和表格。 3、教学难点: 布局管理器的灵活应用,事件处理机制,表格处理。 4、解决办法 原理讲解,操作演示 5、学时分配 常用图形控件,基本组件和容器组件,布局管理器:2学时 事件处理机制:2学时 Swing的特点和类的层次结构,Swing常见组件和容器:2学时 键盘和鼠标事件处理:2学时 高级图形用户界面:菜单、树、表格和多文档界面:2学时 小应用程序:Applet的基本工作原理, Applet生命周期, Applet类中的重要方法, Applet编写方法和Applet与浏览器的参数传递。:2学时 Java的图形程序设计:2学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。安排4学时课内上机实验。 第8章 多线程程序设计 一、教学目的和要求 了解基本组件和容器组件,掌握主要布局管理器的概念和使用方法,掌握事件处理机制及其实现方法,了解Swing的特点和类的层次结构,Swing常见组件和容器;掌握键盘和鼠标事件处理方法,了解高级图形用户界面:菜单、树、表格和多文档界面的编程方法;掌握Java的图形程序设计。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 程序、进程、线程的概念。线程的创建。 线程的状态与线程的控制。线程优先级与线程调度。多线程的同步问题和处理方法。 2、教学重点 线程的创建、线程的控制与调度,多线程同步问题。 3、教学难点 两种创建线程的方法的区别,启动线程的start()方法与直接调用run()方法的区别,多线程同步问题和处理方法。 4、解决办法 原理讲解,操作演示 5、学时分配 程序、进程、线程的概念,线程的创建,线程的状态与线程的控制:2学时 线程优先级与线程调度,多线程的同步问题和处理方法:2学时 三、教学过程(教学方法、实施步骤) 使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。安排2学时课内上机实验。第9章 网络程序设计 一、教学目的和要求 了解基本组件和容器组件,掌握主要布局管理器的概念和使用方法,掌握事件处理机制及其实现方法,了解Swing的特点和类的层次结构,Swing常见组件和容器;掌握键盘和鼠标事件处理方法,了解高级图形用户界面:菜单、树、表格和多文档界面的编程方法;掌握Java的图形程序设计。 二、讲授的内容提要和重点、难点及其解决方法,学时分配 1、教学内容 基于URL获取网络资源 基于TCP的网络程序设计 基于UDP的网络程序设计 2、教学重点 基于URL获取网络资源,基于TCP的网络程序设计。 3、教学难点 支持多客户端/服务器端程序的设计与开发。 4、解决办法 原理讲解,操作演示 5、学时分配 基于URL获取网络资源:1学时 基于TCP的网络程序设计:1.5学时 基于UDP的网络程序设计:1.5学时 三、教学过程(教学方法、实施步骤)使用PPT讲解,对每一个编程知识点编写Java程序进行运行演示。 四、课外学习要求和作业要求 课外作业:要求复习课堂教学内容,对主要知识点布置作业,要求编写程序并条试运行。 武汉大学珞珈学院 系/教研室 Java 面 向 对 象 程 序 设 计 课 教 案 主讲教师:熊春秀 编写时间:2011-4-30 第一章:概述 第 1、2 节:面向对象的基本概念、面向对象程序设计概述 授课时间:2011-2- 22、23 计划学时数:1 教学任务与目的:让学生理解面向对象的基本概念 教学重点:掌握面向对象的基本概念 教学难点:理解面向对象程序设计的方法 教学方法:多媒体+板书 参考书目:《面向对象程序设计导论》,[美]C.Thomas wu著,电子工业出版社 专业词汇:Java虚拟机、Applet程序 备注 第二章:Java特点及运行环境 第 1、2、3 节:Java语言特点、Java应用程序及运行环境、Java Applet程序及运行环境 授课时间:2011-2- 22、23 计划学时数:3 教学任务与目的:让学生学会JDK的下载、安装与环境配置。教学重点:掌握编译和执行Java程序的基本步骤 教学难点:理解Java程序的入口并能够通过命令行传递参数 教学方法:多媒体+板书 参考书目:《面向对象程序设计导论》,[美]C.Thomas wu著,电子工业出版社 专业词汇:JDK、lib、bin 备注 第三章:Java语言基础 第 1、2 节:Java程序的构成、数据类型、表达式以及流程控制语句 授课时间:2011-3- 1、2 计划学时数:3 教学任务与目的:让学生学会Java基本的数据类型和表示方法、数值类型的运算、逻辑运算和比较、条件执行语句(包括三种条件语句和switch语句)、循环控制语句(包括for、while、do while循环及相应的辅助语句)、字符串类String和BufferString以及数组的声明及使用。 教学重点:掌握Java基本的数据类型和表示方法 教学难点:理解Java程序的循环控制语句(包括for、while、do while循环及相应的辅助语句) 教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社 专业词汇:变量、数据类型、循环控制语句 备注 第三章:Java语言基础 第 3 节:Java与C比较 授课时间:2011-3- 8、9 计划学时数:3 教学任务与目的:让学生在C语言的基本上进一步学习Java语言。教学重点:掌握Java语言与C语言的区别与联系。教学难点:理解Java语言在C语言上的改进。教学方法:多媒体+板书 参考书目:《Java2参考大全(第四版)》,[美]Herbert Schildt著,张玉清、吴浦峰、尚勇等译,清华大学出版社。专业词汇:Java、C 备注 第四章:抽象、封装与类 第 1 节:抽象、封装与Java类的概念 授课时间:2011-3- 15、16 计划学时数:3 教学任务与目的:让学生学会面向对象的基本特征、掌握如何定义一个类以及如何生成对象、深入掌握方法的定义及技巧、深入掌握类的访问权限与封装机制、深入掌握包的定义与包的使用方法。 教学重点:掌握类的定义与对象的生成。教学难点:理解类的抽象与封装机制。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:抽象、封装、类 备注 第四章:抽象、封装与类 第 2 节:系统定义的类 授课时间:2011-3- 22、23 计划学时数:3 教学任务与目的:让学生学会使用系统定义的类,并掌握与用户自定义类的区别。教学重点:掌握如何定义所需要的类。 教学难点:熟悉Java平台定义了哪些经常要用到、而且满足我们需要的类。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:系统定义的类、用户自定义类 备注 第四章:抽象、封装与类 第 3 节:类、域和方法的修饰符 授课时间:2011-3- 29、30 计划学时数:3 教学任务与目的:让学生学会类的声明。 教学重点:掌握如何定义类的修饰和方法的修饰符。教学难点:熟悉类的变量的定义与使用方法。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:成员变量、类变量、成员方法、类方法 备注 第五章:继承与多态 第 1、2 节:Java的继承与派生、域的继承与隐藏 授课时间:2011-4- 5、6 计划学时数:3 教学任务与目的:让学生全面掌握面向对象的基本特征、掌握如何使用继承性来到达软件的重用、深入掌握继承过程中域的隐藏和方法的覆盖技巧。教学重点:掌握如何使用继承性来到达软件的重用。教学难点:熟悉继承过程中域的隐藏和方法的覆盖技巧。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:继承派生、域、隐藏 备注 第五章:继承与多态 第 3、4 节:方法的继承、重载与覆盖、this与super、构造函数的继承与重载 授课时间:2011-4- 12、13 计划学时数:3 教学任务与目的:让学生通过继承可以更有效地组织程序结构,明确类之间的关系,并充分利用已有的类来创建新类,通过继承可以实现代码的重用,以完成更复杂的设计、开发。教学重点:掌握类的重载与覆盖的区别与联系。教学难点:熟悉类的重载与覆盖使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:继承、重载、覆盖、this、super 备注 第五章:继承与多态 第 5、6 节:多态性的实现、接口声明与实现 授课时间:2011-4- 19、20 计划学时数:3 教学任务与目的:让学生深入掌握抽象类和抽象方法的定义,掌握多态通过统一多个相关类的对外接口,在运行时根据不同的情况执行不同的操作,提高类的抽象度和灵活性,深入掌握接口的定义和使用技巧。 教学重点:熟悉多态性实现的两种方式以及接口的实现。教学难点:熟悉多态性与接口的实现方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:多态性、接口 备注 第六章:工具类与算法 第 1、2 节:语言基础类库、Applet类与小程序的基本原理 授课时间:2011-4- 26、27 计划学时数:3 教学任务与目的:深入了解Applet生命周期的主要方法和特点、熟练掌握Applet程序的编写方法、深入了解Applet的安全机制及其合理运用。教学重点:熟练掌握Applet程序的编写方法。 教学难点:深入了解Applet的安全机制及其合理运用。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:Applet、生命周期 备注 第六章:工具类与算法 第 3、4 节:数组、字符串、常用算法 授课时间:2011-5- 3、4 计划学时数:3 教学任务与目的:让学生学会字符串类String和BufferString、数组的声明及使用。教学重点:熟练掌握字符串与数组的使用方法。教学难点:深入了解数组的使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:数组、字符串 备注 第七章:用户图形界面的设计 第 1、2 节:用户自定义成分、事件驱动设计 授课时间:2011-5- 10、11 计划学时数:3 教学任务与目的:让学生学会使用面向对象的程序设计方法构建图形用户界面、深入了解抽象窗口工具包(AWT)、掌握事件处理基本原理和方法。教学重点:熟练掌握图形用户界面的开发方法。教学难点:深入了解图形界面的各种事件。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:AWT、GUI 备注 第七章:用户图形界面的设计 第 3、4 节:GUI对象,包括:按钮、文本框、鼠标、键盘等事件的处理、布局设计 授课时间:2011-5- 17、18 计划学时数:3 教学任务与目的:让学生深入了解GUI构件及掌握布局控制方法、熟练掌握菜单和对话框、掌握简单绘图方法。 教学重点:熟练使用Java语言提供的布局管理器来管理组件在容器中的布局。教学难点:深入了解组件在程序中安排中位置和大小使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:布局管理器、容器 备注 第八章:Java高级编程 第 1、2、3节:异常处理、多线程机制、Java程序对网上资源的访问 授课时间:2011-5- 24、25 计划学时数:3 教学任务与目的:让学生深入理解多线程的基本概念、熟练掌握创建线程的两种基本方法、熟练处理线程的同步问题和死锁问题、深入理解异常的基本概念、熟悉和掌握Java平台定义异常类、熟练掌握创建自定义异常类的方法。教学重点:熟练掌握创建线程的两种基本方法。教学难点:深入了解线程的同步问题和死锁问题。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:同步、死锁、多线程、异常第二篇:Java程序设计教案
第三篇:java程序设计教案
第四篇:Java程序设计课程教案
第五篇:java面向对象程序设计教案