任务八 学生成绩操作接口的实现学习目标1.了解接口的概念和意义;2.掌握定义接口和实现接口的方法;3.掌握定义数据表操作接口的方法;4.掌 握实现数据表接口的方法。任务八 学生成绩操作接口的实现一、任务描述 为了对学生成绩表进行增删查改操作,应当建立针对该 表的dao接口,并实现该接口。这样以后针对该表的操作就转化为了实例化接口对象,通过接口提供的方法来操作数据库中的表,这样就很好地实 现了层之间的分离。任务八 学生成绩操作接口的实现二、任务分析操作步骤如下:步骤一:创建学生成绩表操作接口;步骤二:实现学生成绩表 操作接口。任务八 学生成绩操作接口的实现三、任务实施 步骤一:创建学生成绩表操作接口;1.在com.sdlg.dao包中右单击,然后从弹出的菜单中选择“new”,接着选择“in terface”,新建接口StuGradeDao,如下图所示:图8-1 新建StuGradeDao界面【注意】创建接口格式pub lic interface 接口名 {?}任务八 学生成绩操作接口的实现三、任务实施 步骤一:创建学生成绩表操作接口;2.在接口中定义针对学生成绩表操作的各个方法。packag e com.sdlg.dao;?import java.util.List;import com.sdlg.entity.Stu; public interface StuGradeDao { boolean add(Stu stu);//添加记录 boolean update(Stu stu);//修改记录 boolean delete(String sno);/ /删除记录 List queryAll();//查找全部记录}任务八 学生成绩操作接口的实现三、任务实施 步骤二:实现学生成绩表操作接口。1.在com.sdl g.dao.impl包上右单击,选择“new”,选择“class”,新建类StuGradeDaoImpl类,如下所示:import com.sdlg.dao.StuGradeDao;public class StuGradeDaoImpl implements StuGradeDao{}【注意】implements StuGradeDao 为实现该接口。2.实现该接口,当未实现接口中定义 的每一个方法时,将提示错误,如下图所示:【注意】这里的实现在于实现该接口中定义的每一个方法,哪怕有一个方法没有被实现,也会提示错误 ,其次,可以通过把该类定义为抽象类来解决问题,使错误消失。这里,我们要求实现每一个接口中定义的方法。图8-2 错误提示任务八 学生成绩操作接口的实现三、任务实施 步骤二:实现 学生成绩表操作接口。3.在左侧的错误符号上单击,从弹出的提示中,选择“Add unimplemented methods”,如下图 所示:图8-3 通过错误提示添加未实现方法任务八 学生成绩操作接口的实现三、任务实施 步骤二:实现学生成绩表操作接口。4.实现各方法后的代码如下所示:import java. util.List;import com.sdlg.dao.StuGradeDao;import com.sdlg.entity. Stu;public class StuGradeDaoImpl implements StuGradeDao{? @Overri de public boolean add(Stu stu) { // TODO Auto-generated method s tub return false; }? @Override public boolean update(Stu stu) { // TODO Auto-generated method stub return false; }? @Override p ublic boolean delete(String sno) { // TODO Auto-generated method stub return false; }? @Override public List queryAll() { // TODO Auto-generated method stub return null; }}【注意】从语法的角度来讲,只 要给各方法加上{},即方法体,则可理解为实现,语法上可以通过。但是,要实现其功能,我们还需要在方法体中添加各功能代码。任务八 学 生成绩操作接口的实现三、任务实施 步骤二:实现学 生成绩表操作接口。5.实现各方法的功能package com.sdlg.dao.impl;?import java.sql.Res ultSet;import java.sql.SQLException;import java.util.ArrayList;im port java.util.List;?import com.sdlg.dao.StuGradeDao;import com.s dlg.entity.Stu;import com.sdlg.util.DBConnection;?public class St uGradeDaoImpl implements StuGradeDao { DBConnection con = new DBC onnection();? @Override public boolean add(Stu stu) { // 建立插入sql 语句 String sql = "insert into student(sno,sname,classname,sqlkc,j ava,web,gym)values(?,?,?,?,?,?,?)"; int result = con.update(sql, stu.getSno(), stu.getName(), stu.getClassname(), stu.getSql(), s tu.getJava(), stu.getWebdesign(), stu.getGym()); 任务八 学生成绩操作接口的实 现三、任务实施 步骤二:实现学生成绩表操作接口。 5.实现各方法的功能 if (result > 0) { return true; } else { return f alse; } }? @Override public boolean update(Stu stu) { // 建立更新sq l语句 String sql = "update student set sname=?, classname=?, sqlkc =?, java=?, web=?, gym=? where sno=?"; int result = con.update(s ql, stu.getName(), stu.getClassname(), stu.getSql(), stu.getJava( ), stu.getWebdesign(),stu.getGym(), stu.getSno()); if (result > 0) { return true; } else { return false; } }? 任务八 学生成绩操作接口 的实现三、任务实施 步骤二:实现学生成绩表操作接 口。5.实现各方法的功能? @Override public boolean dele te(String sno) { // 建立删除sql语句 String sql = "delete from student where sno=?"; int result = con.update(sql, sno); if (result > 0) { return true; } else { return false; } }? 任务八 学生成绩操作接 口的实现三、任务实施 步骤二:实现学生成绩表操作 接口。5.实现各方法的功能 @Override public List queryAll() { return stu list(con.query("select from student")); } private List stulist(ResultSet rs) { List stulist = n ew ArrayList(); try { while (rs.next()) { Stu stu = ne w Stu(); stu.setSno(rs.getString("sno")); stu.setName(rs.ge tString("sname")); stu.setClassname(rs.getString("classname")) ; stu.setJava(rs.getFloat("java")); stu.setSql(rs.getFloat( "sqlkc")); stu.setWebdesign(rs.getFloat("web")); stu.setGym (rs.getFloat("gym")); stulist.add(stu); } } catch (SQLExcep tion e) { e.printStackTrace(); } return stulist; }}任务八 学生成绩操 作接口的实现四、相关知识8.4.1抽象类和接口1.抽象类抽象类是普通类与接口之间的一种中庸之道。Java规定,用关键字abstra ct修饰的类称为抽象类(abstract类),用关键字abstract修饰的方法称为抽象方法。例如:abstract class Base{ //抽象类定义 abstract void method1(); //抽象方法定义 void method2(){ //具体方法定义 System.out.println("method2");}}声明格式:abstract class 类名{ abstrac t 数据类型 方法名(参数表);}任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和接口1.抽象类【注意】 (1) 方法声明中没有{}; (2)方法声明最后的“;”不能省略。【说明】(1)用abstract修饰的类表示抽象类,抽象类不能被实例 化,即不允许创建抽象类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。(2)用abstract修饰的方法 表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用abstract修饰的方法称为具体方 法,具体方法具有方法体。(3)抽象方法必须声明在抽象类中,而且抽象方法只需声明,不需实现。(4)父类中的某些抽象方法不包含任何逻辑 ,需要在子类继承中由子类提供抽象方法的实现细节。(5)含有抽象方法的类必须声明为抽象类(abstract类)。抽象类中不一定包含抽 象方法,但包含抽象方法的类一定要声明为抽象类。(6)抽象类中可以包含构造方法,由于不能利用抽象类直接创建对象,因此抽象类中定义构造 方法是多余的。任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和接口1.抽象类abstract class Base{ abstract void method1(); abstract void method2();}class Sub extends Base{ void method1(){ System.out.println ("method1");}} 【例8.1】找出下面程序中的错误,并说明原因。任务八 学生成绩操作接口的实现四、相关知识8.4.1 抽象类和接口2.接口 接口(interface)就是方法和常量的集合,为了使Java程序的类层次结构更加合理,更符合 实际问题的本质,编译者可以把用于完成特定功能的若干属性组织成相对独立的属性集合;凡是需要实现这种特定功能的类,都可以继承这个属性集 合并在类内使用它,这种属性集合就是接口。【说明】 接口使抽象的概念更向前迈进了一步,接口产生一个完全的抽象类,它根本 就没有提供任何具体实现。允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供形式,不提供任何具体实现。接口定义 格式: [public] interface 接口名{ [public][static][final] 类型 变量名=常量值; [public][abstract]类型 方法名(参数列表);} 说明:接口修饰符为public或省略形式 ,分别为公共接口,或者是友好接口;而属性和方法均为public权限。任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和 接口接口体由两部分组成:(1)对接口中属性的声明接口中只能包含public、static、final类型的成员变量,因此接口中的属 性都是用final修饰的常量。(2)对接口中方法的声明接口中只能包含public、abstract类型的成员方法,不能有非抽象方法 。在接口中只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即仅仅规定了一组信息交换、传输和处理的“接口”。【例8 .2】接口定义举例public interface A { public static final int X=1; public static final int Y=2; public static final int Z=3 ; public void show();}任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和接口publi c interface A{ int var; void method1(){ System.out.p rintln("method1"); } protected void method2(); static v oid method3(){ System.out.println("method3"); }} 【例8.3】 找出下面程序中的错误,并说明原因。任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和接口3.接口的实现接口的实现:接口 由类来实现,而且一个类能实现许多接口。实现的格式如下:class 类名 implements 接口1 [,接口2,接口3,…,接口 n]{ ......}例如:假设A,B,C为已经定义的接口public class MyInterface im plements A,B,C{ ...... }【说明】类MyInterface实现了三个接口,即实现三者所有方 法。任务八 学生成绩操作接口的实现四、相关知识8.4.1抽象类和接口3.接口的实现【例8.4】实现SayHello接口inter face SayHello { void printMessage(); }class MySayHello im plements SayHello { public void printMessage() { System.out.println("Hello"); }}任务八 学生成绩操作接口的实现四、相关知识8.4 .1抽象类和接口3.接口的实现【例8.5】找出下面程序中的错误,说明原因,并进行改正。interface SayHello { void printMessage(); void receiveMessage(); } class MySayHello implements SayHello { public void printMessage () { 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接口反映了对象较高层次的抽象,为描述相互似乎没有关系的对象的共性提供了一种有效的手段。任务八 学生成绩操作接口的 实现四、相关知识4.类和接口的区别(1)类只能继承一个类,而对于接口,类可以实现多个接口。 (2)对于继承性,类继承了超类的方法: 子类可以选择是否覆盖超类的方法。接口的方法没有实现,因此,类必须实现接口中的每个方法。(3)从本质上讲,接口是一种特殊的抽象类,这 种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。(4)接口像一个规范,一个协议,而类则是实现了这个协议,满足这个规范的具 体实现。5.接口和抽象类的区别相同点:(1)都包含抽象方法,声明多个类共享方法首部。(2)都不能被实例化。不同点:(1)一个类只能 继承一个抽象类,而一个类可以实现多个接口。(2)访问权限不同,抽象类和普通类一样,而接口的访问权限是默认和public,接口成员都 是public。(3)抽象类和接口中的成员变量不同。(4)抽象类可包含抽象方法和普通方法,接口只能是抽象方法。6.接口的作用(1) 使用接口可以使设计与实现相分离,使使用接口的用户程序不受不同接口实现的影响,不受接口实现改变的影响。(2)弥补Java只支持类单继 承的不足,它用来完成多继承的一些功能。Java接口反映了对象较高层次的抽象,为描述相互似乎没有关系的对象的共性提供了一种有效的手段 。任务八 学生成绩操作接口的实现四、相关知识7.接口的继承接口之间可以存在继承关系,但不能是实现关系。interface A{ void method1();}interface B{ void method2();}interface D extend s A,B{ } //合法interface E implements A,B{ } //错误 任务八 学生成绩操作 接口的实现四、相关知识//定义接口interface Animal{ void eat(); void sleep();} interface Man extends Animal{ void think();} interface School { void classroom();}?//定义抽象类Studentabstract class Student imp lements Man,School{ public abstract void study();}//定义大学生类class Undergraduate extends Student{ String name; public Undergr aduate(String name){ this.name=name; } public void st udy(){ System.out.println(name+"can study."); } publi c void classroom(){ System.out.println(name+"has classroom to study."); } public void think(){ System.out.p rintln(name+"can think."); } public void eat(){ Sy stem.out.println(name+"can eat."); } public void sleep(){ System.out.println(name+"can sleep."); } void ablity (){ this.sleep(); this.eat(); this.think( ); this.study(); this.classroom(); }}//定义测试类pu blic class Exp86{ public static void main(String args[ ]){ Undergraduate s=new Undergraduate("李平"); s.ablity(); } }运行结果:图8-4 例8.4运行效果图【例8.6】任务八 学生成绩操作接口的实现四、相关知识8.接口的多态多态:同一个接口可 以由多个类来实现,接口中的同一个方法在实现这个接口的不同的类中可以有不同的具体实现。【例8.7】public interface A { public static final int X = 1; public static final int Y = 2; public static final int Z = 3; public void show();}class B imple ments A { public void show() { System.out.println("class B"); }} class C implements A { public void show() { System.out.println(" class C"); }}任务八 学生成绩操作接口的实现四、相关知识8.4.2 List与ArrayList List包括L ist接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接 口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表8-1所示。。表8-1 Li st接口相关方法任务八 学生成绩操作接口的实现四、相关知识8.4.2 List与ArrayList 2.实例化接口 L ist接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。 List接口的常用实现类有ArrayList和LinkedList,在使用List集合时,通常情况下声明为List类型,实 例化时根据实际情况的需要,实例化为ArrayList或LinkedList。add(int index, Object obj)方 法和set(int index, Object obj)方法的区别在使用List集合时需要注意区分add(int index, O bject obj)方法和set(int index, Object obj)方法,前者是向指定索引位置添加对象,而后者是修改指定 索引位置的对象。//?利用ArrayList类实例化List集合List<数据类型A> 对象名称 = new ArrayList< 数据类型A>();//?利用LinkedList类实例化List集合List<数据类型B> 对象名称= new LinkedLis t<数据类型B>();任务八 学生成绩操作接口的实现四、相关知识8.4.2 List与ArrayListimport java. util.Iterator;import java.util.LinkedList;import java.util.List;? public class Exp88{ public static void main(String[] args) { Str ing a = "A", b = "B", c = "C", d = "D", e = "E"; List li st = new LinkedList(); list.add(a); list.add(e); list. add(d); list.set(1, b);// 将索引位置为1的对象e修改为对象b list.add(2, c);// 将 对象c添加到索引位置为2的位置 Iterator it = list.iterator(); while (i t.hasNext()) { System.out.println(it.next()); } }}【例8.8】遍历List 举例1运行结果:ABCD任务八 学生成绩操作接口的实现四、相关知识8.4.2 List与ArrayListimport java .util.ArrayList;import java.util.LinkedList;import java.util.Iter ator;import java.util.List;?public class Exp89{ public static voi d main(String[] args) { System.out.println("开始:"); String a = " A", b = "B", c = "C", d = "D", e = "E"; List list = new LinkedList(); list.add(a); list.add(e); list.add(d); list.set(1, b);// 将索引位置为1的对象e修改为对象b list.add(2, c);// 将对象c添加到索引位 置为2的位置 Iterator it = list.iterator(); while (it.hasNext ()) { System.out.println(it.next()); } for (int i = 0; i < li st.size(); i++) {// 利用get(int index)方法获得指定索引位置的对象 System.out.pr intln(list.get(i)); } System.out.println("结束!"); }}【例8.9】遍历 List举例2运行结果:开始:ABCDABCD结束!因为List集合可以通过索引位置访问对象,所以还可以通过for循环遍历List 集合,例如遍历上面代码中的List集合的代码如下:任务八 学生成绩操作接口的实现六、任务训练 1.利用抽 象类分别求三角形、矩形和圆的面积、周长。import java.util.;public class HHst { public static void main(String[] args) { Geometric g = new Triangle(3, 4, 5); System.out.println("三角形的面积为" + g.getArea()); System.out .println("三角形的周长为" + g.getPerimeter()); g = new Rectangle(2, 3); System.out.println("矩形的面积为" + g.getArea()); System.out.println ("矩形的周长为" + g.getPerimeter()); g = new Circle(1); System.out.pr intln("圆的面积为" + g.getArea()); System.out.println("圆的周长为" + g.get Perimeter()); }}abstract class Geometric { // 定义抽象类Geometric publ ic abstract double getArea();// 定义抽象方法求面积 public abstract double getPerimeter();// 定义抽象方法求周长}class Triangle extends Geometric { // 继承抽象类 int a; int b; int c; public Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } 任务八 学生成绩操作接口的实现六、任务训练 1.利用抽象类分别求三角形、矩形和圆的面积、周长。 public double getArea() { double s = 0.25 Math.sqrt((a + b + c) (a + b - c) (a - b + c) (b + c - a)); return s; } public double getPerimeter() { return a + b + c; }}class Rectangle extends Geometric { // 继承抽象类 int a; int b; public Rectangle(int a, int b) { this.a = a; this .b = b; } public double getArea() { return a b; } public doubl e getPerimeter() { return 2 (a + b); }}任务八 学生成绩操作接口的实现六、任务训练 1.利用抽象类分别求三角形、矩形和圆的面积、周长。class Circle extends Geometr ic { // 继承抽象类 int r; public Circle(int r) { this.r = r; } public double getArea() { return Math.PI r r; } public double getP erimeter() { return 2 Math.PI r; }图8-5 抽象类实例运行结果任务八 学生成绩操作 接口的实现七、拓展提高 Java SE5 引入了一种更加简洁的for语法格式,可以用于遍历数组和集合,是for循环的 增强版本。foreach虽然对for循环进行了简化,但是并不是说foreach就比for更好用,foreach适用于循环次数未知, 或者计算循环次数比较麻烦的情况。但是更为复杂的一些循环还是需要用到for循环。这里需要注意一点:forEach只能取值,不能赋值。 1.Java的forEach用法forEach格式如下:for(元素类型 元素变量x:遍历对象(数组或集合)){ 引用元素变量x的语句; }任务八 学生成绩操作接口的实现七、拓展提高【例8.10】遍历数组示例1.Java的fo rEach用法import java.util.;public class fe { public static void ma in(String[] args) { int[] a={11,22,33,44,55,66}; for(int x:a){ System.out.println(x); } }}运行结果:任务八 学生成绩操作接口的实现七、拓展提高2.Java迭代器 迭代器是一种模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。 不同java集合的内部结构是不一样的,如果为每种容器都单独实现一种遍历方法十分麻烦,为了简化遍历容器的操作,所以推出了java迭代器(Iterator)。 Iterator接口包含三个方法:hasNext(),next(),remove()。 hasNext():每次next之前,先调用此方法探测是否迭代到终点。 next():返回当前迭代元素 ,同时,迭代游标后移。 remove():删除最近一次已经迭代出去的那个元素。【注意】只有当next()执行完后,才能调用remove()函数。比如你要删除第一个元素,不能直接调用 remove(),而要先next()一下;如果没有先调用next()就调用remove()方法是会抛出异常的。任务八 学生成绩操作接口的实现七、拓展提高2.Java迭代器【例8.11】迭代示例import java.util.ArrayList;import java.util.Iterator;public class diedai{ public static void main(String[] args) { ArrayListlist=new ArrayList(); list.add("中国加油"); list.add("武汉加油"); list.add("大家都要好好的"); for(Iterator iterator=list.iterator();iterator.hasNext();) { System.out.println(iterator.next()); } }}运行结果:任务八 学生成绩操作接口的实现小 结 本任务主要完成了学生成绩操作接口的定义及接口的实现,通过本任务的学习,读者学习了接口与抽象类的基本知识和操作。通过本任务的实施,读者掌握了在项目中通过定义接口,实现接口来操纵数据库中二维表数据的增删查改,这是将GUI项目开发中比较关键的一个步骤。。 |
|