JAVA语言编程基础教案22 学生成绩操作接口的实现.docx
《JAVA语言编程基础教案22 学生成绩操作接口的实现.docx》由会员分享,可在线阅读,更多相关《JAVA语言编程基础教案22 学生成绩操作接口的实现.docx(41页珍藏版)》请在冰豆网上搜索。
JAVA语言编程基础教案22学生成绩操作接口的实现
山东理工职业学院单元教学过程设计首页
课程所属院(部):
软件工程学院2019--2020学年第一学期
课程名称
Java语言编程基础
任课教师
单元标题
项目二任务2学生成绩类操作接口的实现
上课地点
学时
6
授课班级
授课时间
第周
第周
第周
第周
第周
第周
星期
星期
星期
星期
星期
星期
第节
第节
第节
第节
第节
第节
月日
月日
月日
月日
月日
月日
教学目标
能力目标
知识目标
1.能掌握利用接口编写程序的方法
1.了解接口的概念和意义;
2.掌握定义接口和实现接口的方法;
3.掌握定义数据表操作接口的方法;
4.掌握实现数据表接口的方法。
教学任务
通过接口提供的方法来操作数据库中的表
教学重、难点
重点:
定义接口和实现接口的方法
难点:
实现数据表接口的方法
教学材料或用具
教材、教案、课件、课程标准、案例素材及Eclipse开发软件
课后任务
1.利用抽象类分别求三角形、矩形和圆的面积、周长。
2.巩固例子
山东理工职业学院单元教学过程设计
步骤及时间
教学内容
教师活动
学生活动
5分钟
5分钟
20分钟
40分钟
50分钟
20分钟
50分钟
60分钟
10分钟
【组织教学】
1、检查学生出勤,作好学生考勤记录。
2、课堂提问,了解学生掌握所学知识情况。
3、强调课堂纪律,加强互动,活跃课堂气氛。
【课题导入】
任务1.1用记事本完成了代码设计,但是还无法看到代码执行后的效果。
任务二是在任务一的基础上,利用Java语言的开发工具运行该程序,并得到运行结果。
在此过程中,需要了解开发工具的使用方法、文件建立的方法、代码的编写、存储,以及程序的运行过程。
【讲授新课】
8.4.1抽象类和接口
1.抽象类
抽象类是普通类与接口之间的一种中庸之道。
Java规定,用关键字abstract修饰的类称为抽象类(abstract类),用关键字abstract修饰的方法称为抽象方法。
例如:
abstractclassBase{//抽象类定义
abstractvoidmethod1();//抽象方法定义
voidmethod2(){//具体方法定义
System.out.println("method2");
}
}
声明格式:
abstractclass类名{
abstract数据类型方法名(参数表);
}
【注意】
(1)方法声明中没有{};
(2)方法声明最后的“;”不能省略。
【说明】
(1)用abstract修饰的类表示抽象类,抽象类不能被实例化,即不允许创建抽象类本身的实例。
没有用abstract修饰的类称为具体类,具体类可以被实例化。
(2)用abstract修饰的方法表示抽象方法,抽象方法没有方法体。
抽象方法用来描述系统具有什么功能,但不提供具体的实现。
没有用abstract修饰的方法称为具体方法,具体方法具有方法体。
(3)抽象方法必须声明在抽象类中,而且抽象方法只需声明,不需实现。
(4)父类中的某些抽象方法不包含任何逻辑,需要在子类继承中由子类提供抽象方法的实现细节。
(5)含有抽象方法的类必须声明为抽象类(abstract类)。
抽象类中不一定包含抽象方法,但包含抽象方法的类一定要声明为抽象类。
(6)抽象类中可以包含构造方法,由于不能利用抽象类直接创建对象,因此抽象类中定义构造方法是多余的。
【例8.1】找出下面程序中的错误,并说明原因。
abstractclassBase{
abstractvoidmethod1();
abstractvoidmethod2();
}
classSubextendsBase{
voidmethod1(){
System.out.println("method1");
}
}
2.接口
接口(interface)就是方法和常量的集合,为了使Java程序的类层次结构更加合理,更符合实际问题的本质,编译者可以把用于完成特定功能的若干属性组织成相对独立的属性集合;凡是需要实现这种特定功能的类,都可以继承这个属性集合并在类内使用它,这种属性集合就是接口。
【说明】
接口使抽象的概念更向前迈进了一步,接口产生一个完全的抽象类,它根本就没有提供任何具体实现。
允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。
接口只提供形式,不提供任何具体实现。
接口定义格式:
[public]interface接口名{
[public][static][final]类型变量名=常量值;
[public][abstract]类型方法名(参数列表);
}
说明:
接口修饰符为public或省略形式,分别为公共接口,或者是友好接口;而属性和方法均为public权限。
接口体由两部分组成:
(1)对接口中属性的声明
接口中只能包含public、static、final类型的成员变量,因此接口中的属性都是用final修饰的常量。
(2)对接口中方法的声明
接口中只能包含public、abstract类型的成员方法,不能有非抽象方法。
在接口中只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即仅仅规定了一组信息交换、传输和处理的“接口”。
【例8.2】接口定义举例
publicinterfaceA{
publicstaticfinalintX=1;
publicstaticfinalintY=2;
publicstaticfinalintZ=3;
publicvoidshow();
}
【例8.3】找出下面程序中的错误,并说明原因。
publicinterfaceA{
intvar;
voidmethod1(){
System.out.println("method1");
}
protectedvoidmethod2();
staticvoidmethod3(){
System.out.println("method3");
}
}
3.接口的实现
接口的实现:
接口由类来实现,而且一个类能实现许多接口。
实现的格式如下:
class类名implements接口1[,接口2,接口3,…,接口n]{
......}
例如:
假设A,B,C为已经定义的接口
publicclassMyInterfaceimplementsA,B,C{
......}
【说明】类MyInterface实现了三个接口,即实现三者所有方法。
【例8.4】实现SayHello接口
interfaceSayHello{
voidprintMessage();
}
classMySayHelloimplementsSayHello{
publicvoidprintMessage(){
System.out.println("Hello");
}
}
【例8.5】找出下面程序中的错误,说明原因,并进行改正。
interfaceSayHello{
voidprintMessage();
voidreceiveMessage();
}
classMySayHelloimplementsSayHello{
publicvoidprintMessage(){
System.out.println("Hello");
}
}
【注意】
(1)接口一经声明并实现,即可以使用。
(2)同一个接口可以由多个类来实现,接口中的同一个方法在实现这个接口的不同的类中可以有不同的具体实现(多态性)。
(3)接口是一个规范,是一个抽象的概念,由类把这个规范具体实现。
4.类和接口的区别
(1)类只能继承一个类,而对于接口,类可以实现多个接口。
(2)对于继承性,类继承了超类的方法:
子类可以选择是否覆盖超类的方法。
接口的方法没有实现,因此,类必须实现接口中的每个方法。
(3)从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
(4)接口像一个规范,一个协议,而类则是实现了这个协议,满足这个规范的具体实现。
5.接口和抽象类的区别
相同点:
(1)都包含抽象方法,声明多个类共享方法首部。
(2)都不能被实例化。
不同点:
(1)一个类只能继承一个抽象类,而一个类可以实现多个接口。
(2)访问权限不同,抽象类和普通类一样,而接口的访问权限是默认和public,接口成员都是public。
(3)抽象类和接口中的成员变量不同。
(4)抽象类可包含抽象方法和普通方法,接口只能是抽象方法。
6.接口的作用
(1)使用接口可以使设计与实现相分离,使使用接口的用户程序不受不同接口实现的影响,不受接口实现改变的影响。
(2)弥补Java只支持类单继承的不足,它用来完成多继承的一些功能。
Java接口反映了对象较高层次的抽象,为描述相互似乎没有关系的对象的共性提供了一种有效的手段。
7.接口的继承
接口之间可以存在继承关系,但不能是实现关系。
interfaceA{
voidmethod1();
}
interfaceB{
voidmethod2();
}
interfaceDextendsA,B{}//合法
interfaceEimplementsA,B{}//错误
【例8.6】
//定义接口
interfaceAnimal{
voideat();
voidsleep();}
interfaceManextendsAnimal{
voidthink();}
interfaceSchool{
voidclassroom();}
//定义抽象类Student
abstractclassStudentimplementsMan,School{
publicabstractvoidstudy();
}
//定义大学生类
classUndergraduateextendsStudent{
Stringname;
publicUndergraduate(Stringname){
this.name=name;}
publicvoidstudy(){
System.out.println(name+"canstudy.");}
publicvoidclassroom(){
System.out.println(name+"hasclassroomtostudy.");}
publicvoidthink(){
System.out.println(name+"canthink.");}
publicvoideat(){
System.out.println(name+"caneat.");}
publicvoidsleep(){
System.out.println(name+"cansleep.");}
voidablity(){
this.sleep();
this.eat();
this.think();
this.study();
this.classroom();}
}
//定义测试类
publicclassExp86{
publicstaticvoidmain(Stringargs[]){
Undergraduates=newUndergraduate("李平");
s.ablity();
}
}
运行结果:
图8-4例8.4运行效果图
8.接口的多态
多态:
同一个接口可以由多个类来实现,接口中的同一个方法在实现这个接口的不同的类中可以有不同的具体实现。
【例8.7】
publicinterfaceA{
publicstaticfinalintX=1;
publicstaticfinalintY=2;
publicstaticfinalintZ=3;
publicvoidshow();
}
classBimplementsA{
publicvoidshow(){
System.out.println("classB");
}
}
classCimplementsA{
publicvoidshow(){
System.out.println("classC");
}
}
8.4.2List与ArrayList
List包括List接口以及List接口的所有实现类。
因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表8-1所示。
表8-1List接口相关方法
方法名称
功能简介
add(intindex,Objectobj)
用来向集合的指定索引位置添加对象,其他对象的索引位置相对后移一位,索引位置从0开始。
addAll(int,Collectioncol)
用来向集合的指定索引位置添加指定集合中的对象。
remove(intindex)
用来清除集合中指定索引位置的对象
set(intindex,Objectobj)
用来将集合中指定索引位置的对象修改为指定对象
get(intindex)
用来获得指定索引位置的对象
indexOf(Objectobj)
用来获得指定对象的索引位置。
当存在多个时,返回一个索引位置;当不存在时,返回-1
lastIndexOf(Objectobj)
用来获得指定对象的索引位置。
当存在多个时,返回最后一个的索引位置;当不存在时,返回-1
2.实例化接口
List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。
List接口的常用实现类有ArrayList和LinkedList,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。
格式:
// 利用ArrayList类实例化List集合
List<数据类型A>对象名称=newArrayList<数据类型A>();
// 利用LinkedList类实例化List集合
List<数据类型B>对象名称=newLinkedList<数据类型B>();
3.add(intindex,Objectobj)方法和set(intindex,Objectobj)方法的区别
在使用List集合时需要注意区分add(intindex,Objectobj)方法和set(intindex,Objectobj)方法,前者是向指定索引位置添加对象,而后者是修改指定索引位置的对象。
【例8.8】遍历List举例1
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.List;
publicclassExp88{
publicstaticvoidmain(String[]args){
Stringa="A",b="B",c="C",d="D",e="E";
Listlist=newLinkedList();
list.add(a);
list.add(e);
list.add(d);
list.set(1,b);//将索引位置为1的对象e修改为对象b
list.add(2,c);//将对象c添加到索引位置为2的位置
Iteratorit=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果:
A
B
C
D
因为List集合可以通过索引位置访问对象,所以还可以通过for循环遍历List集合,例如遍历上面代码中的List集合的代码如下:
【例8.9】遍历List举例2
importjava.util.ArrayList;
importjava.util.LinkedList;
importjava.util.Iterator;
importjava.util.List;
publicclassExp89{
publicstaticvoidmain(String[]args){
System.out.println("开始:
");
Stringa="A",b="B",c="C",d="D",e="E";
Listlist=newLinkedList();
list.add(a);
list.add(e);
list.add(d);
list.set(1,b);//将索引位置为1的对象e修改为对象b
list.add(2,c);//将对象c添加到索引位置为2的位置
Iteratorit=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(inti=0;i//利用get(intindex)方法获得指定索引位置的对象
System.out.println(list.get(i));}
System.out.println("结束!
");
}
}
运行结果:
开始:
A
B
C
D
A
B
C
D
结束!
【知识拓展】
1.Java的forEach用法
JavaSE5引入了一种更加简洁的for语法格式,可以用于遍历数组和集合,是for循环的增强版本。
foreach虽然对for循环进行了简化,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦的情况。
但是更为复杂的一些循环还是需要用到for循环。
这里需要注意一点:
forEach只能取值,不能赋值。
forEach格式如下:
for(元素类型元素变量x:
遍历对象(数组或集合)){
引用元素变量x的语句;
}
【例8.10】遍历数组示例
importjava.util.*;
publicclassfe{
publicstaticvoidmain(String[]args){
int[]a={11,22,33,44,55,66};
for(intx:
a){
System.out.println(x);
}
}
}
图8-6forEach实例运行结果
2.Java迭代器
迭代器是一种模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。
只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。
不同java集合的内部结构是不一样的,如果为每种容器都单独实现一种遍历方法十分麻烦,为了简化遍历容器的操作,所以推出了java迭代器(Iterator)。
Iterator接口包含三个方法:
hasNext(),next(),remove()。
hasNext():
每次next之前,先调用此方法探测是否迭代到终点。
next():
返回当前迭代元素,同时,迭代游标后移。
remove():
删除最近一次已经迭代出去的那个元素。
【注意】
只有当next()执行完后,才能调用remove()函数。
比如你要删除第一个元素,不能直接调用remove(),而要先next()一下;如果没有先调用next()就调用remove()方法是会抛出异常的。
【例8.11】迭代示例
importjava.util.ArrayList;
importjava.util.Iterator;
publicclassdiedai{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
list.add("中国加油");
list.add("武汉加油");
list.add("大家都要好好的");
for(Iteratoriterator=list.iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
}
}
图8-7迭代示例运行结果
【技能训练】
一、任务分析
操作步骤如下:
步骤一:
创建学生成绩表操作接口;
步骤二:
实现学生成绩表操作接口。
二、任务实施
步骤一:
创建学生成绩表操作接口;
1.在com.sdlg.dao包中右单击,然后从弹出的菜单中选择“new”,接着选择“interface”,新建接口StuGradeDao,如下图所示:
图8-1新建StuGradeDao界面
【注意】创建接口格式
publicinterface接口名{
}
2.在接口中定义针对学生成绩表操作的各个方法。
packagecom.sdlg.dao;
importjava.util.List;
importcom.sdlg.entity.Stu;
publicinterfaceStuGradeDao{
booleanadd(Stustu);//添加记录
booleanupdate(Stustu);//修改记录
booleandelete(Stringsno);//删除记录
ListqueryAll();//查找全部记录
}
步骤二:
实现学生成绩表操作接口。
1.在com.sdlg.dao.impl包上右单击,选择“new”,选择“class”,新建类StuGradeDaoImpl类,如下所示:
importcom.sdlg.dao.StuGradeDao;
publicclassStuGradeDaoImplimplementsStuGradeDao{
}
【注意】implementsStuGradeDao为实现