ch面向对象编程面向接口实用实用教案

上传人:枫** 文档编号:590680614 上传时间:2024-09-15 格式:PPT 页数:48 大小:1.61MB
返回 下载 相关 举报
ch面向对象编程面向接口实用实用教案_第1页
第1页 / 共48页
ch面向对象编程面向接口实用实用教案_第2页
第2页 / 共48页
ch面向对象编程面向接口实用实用教案_第3页
第3页 / 共48页
ch面向对象编程面向接口实用实用教案_第4页
第4页 / 共48页
ch面向对象编程面向接口实用实用教案_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《ch面向对象编程面向接口实用实用教案》由会员分享,可在线阅读,更多相关《ch面向对象编程面向接口实用实用教案(48页珍藏版)》请在金锄头文库上搜索。

1、掌握Java接口理解Java接口与多态的关系掌握面向接口编程的思想掌握常量(chngling)接口的使用设计模式本章(bn zhn)目标第1页/共47页第一页,共48页。单一(dny)继承的局限性1 1、如下的类图描述正确吗?2 2、青蛙(qngw)(qngw)是两栖动物,怎么办呢?我该何处我该何处(h ch)何从何从第2页/共47页第二页,共48页。什么(shn me)(shn me)是JavaJava接口接口与前面所学的抽象类一样是一种规范和标准、可以约束(yush)类的行为定义一个接口不指定具体的实现一个Java接口是一些方法特征的集合,但没有方法的实现JavaJava接口(ji ku)

2、(ji ku)中定义的方法在不同的地方被实现,可以具有完全不同的行为第3页/共47页第三页,共48页。一个(y )例子第4页/共47页第四页,共48页。一个(y )实例public interface PCI public interface PCI public void start(); public void start(); public void stop(); public void stop(); class SoundCard implements PCI class SoundCard implements PCI public void start() public voi

3、d start() System.out.println(Du System.out.println(Du du.);du.); public void stop() public void stop() System.out.println(Sound System.out.println(Sound stop!);stop!); 这是JavaJava接口(ji ku)(ji ku),相当于主板上的PCIPCI插槽的规范class NetworkCard implements PCI class NetworkCard implements PCI public void start() p

4、ublic void start() System.out.println(Send.);System.out.println(Send.); public void stop() public void stop() System.out.println(Network System.out.println(Network stop!);stop!); 声卡、网卡都实现了PCIPCI插槽的规范,但行为(xngwi)(xngwi)完全不同 第5页/共47页第五页,共48页。一个(y )实例public class Assembler public class Assembler public

5、static void main(String public static void main(String args) args) PCI nc = new NetworkCard(); PCI nc = new NetworkCard(); PCI sc = new SoundCard(); PCI sc = new SoundCard(); nc.start(); nc.start(); sc.start(); sc.start(); 可以使用JavaJava接口标识类型运行(ynxng)(ynxng)时,根据实际创建的对象类型调用相应的方法实现Du du.Du du.Send.Send

6、.控制台输出(shch)(shch)2 21 1第6页/共47页第六页,共48页。生活(shnghu)中的接口USB接口接口(ji ku)使用使用USB接口必须接口必须(bx)符合符合USB规范规范接口是一套规范,遵守这个规范就可以实现功能接口是一套规范,遵守这个规范就可以实现功能 第7页/共47页第七页,共48页。接口(ji ku)的特点JAVAJAVA中一个(y )(y )类能否继承多个父类?v接口:v接口可以说是对继承单根性的扩展v接口提供了一组规范、一个标准v接口屏蔽了实现的细节v方便多人协同开发v特点:v接口不能被实例化v不管是否标识,接口中所有方法都是抽象的,公共的。v接口中只能(

7、zh nn )定义常量第8页/共47页第八页,共48页。用接口(ji ku)实现让我们为青蛙找一个让我们为青蛙找一个(y )合法的身份?合法的身份? 第9页/共47页第九页,共48页。JAVAJAVA接口(ji ku)(ji ku)开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下:教员、以及中心都具有方法:输出(shch)详细信息中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息系统要具备良好的可扩展性与可维护性打印打印 教员教员(jioyun) 中心中心 教员教员详细信息详细信息中心中心详细信息详细信息detail方法方法(输出详细信息)(输出详细信息)第10页

8、/共47页第十页,共48页。JAVAJAVA接口(ji ku)(ji ku)以下这个解决方案中存在着什么(shn me)问题?public class UCSTeacher1 public class UCSTeacher1 / /输出教员(jioyun)(jioyun)的详细信息public String detail() public String detail() return return 本人是CSUCSU教员(jioyun);(jioyun); public class UCSSchool1 public class UCSSchool1 private Printer print

9、er = new private Printer printer = new Printer();Printer(); / /输出中心的详细信息public String detail() public String detail() return return 这里是CSUCSU中心; /使用打印机打印教员信息public void print(UCSTeacher1 t)public void print(UCSTeacher1 t)printer.print(t.detail();printer.print(t.detail(); /使用打印机打印中心信息public void prin

10、t(UCSSchool1 s)public void print(UCSSchool1 s)printer.print(s.detail();printer.print(s.detail(); public class Printer public class Printer public void print(String content) public void print(String content) System.out.println(System.out.println( 开始打印:););System.out.println(content);System.out.printl

11、n(content); 每增加一种新类型,都需要增加相应的print(print(类型名称 var)var)方法程序的可扩展性及可维护性极差这不符合系统的要求第11页/共47页第十一页,共48页。用Java接口(ji ku)重构项目 v在这个系统中,存在继承关系吗?v教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类v教员、中心都存在一个共同的方法特征:detail,它们(t men)对detail方法有各自不同的实现这完全符合Java接口的定义第12页/共47页第十二页,共48页。类图定义一个JavaJava接口,在其中定义detaildetail方法,但没有(m(m i

12、yu)i yu)具体实现实现这个(zh(zh ge)Java ge)Java接口,不同的类对detaildetail方法有不同的具体实现第13页/共47页第十三页,共48页。使用了Java接口之后,这个(zh ge)系统有了怎样的改进?JavaJava接口(ji ku)(ji ku)重构之后public interface IPrintable public interface IPrintable public String detail();public String detail(); public class UCSSchool2 public class UCSSchool2 imp

13、lements implements IntroduceableIntroduceable private Printer printer = new private Printer printer = new Printer();Printer(); / /输出中心的详细信息public String detail() public String detail() return “return “这里(zhl)(zhl)是中信培训中心; /使用中心打印机打印信息public void print(IPrintable intro) public void print(IPrintable i

14、ntro) printer.print(intro.detail();printer.print(intro.detail(); public class UCSTeacher2 public class UCSTeacher2 implements IPrintable implements IPrintable / /输出教员的详细信息public String detail() public String detail() return “return “本人是中信教员; 通过JavaJava接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性 使用printprin

15、t方法时,参数可以是任何IntroduceableIntroduceable接口的实现类的对象,不必再为不同的类型建立不同的printprint方法了第14页/共47页第十四页,共48页。接口(ji ku)作为参数接口描述了一个对象的特征传递接口就是(jish)传递了实现接口的对象public class SxtSchool2 public class SxtSchool2 /使用(shyng)(shyng)中心打印机打印信息public void print(Introduceable intro) public void print(Introduceable intro) printer

16、.print(intro.detail();printer.print(intro.detail(); 第15页/共47页第十五页,共48页。什么(shn me)是面向接口编程开发系统时,主体构架使用接口,接口构成(guchng)系统的骨架这样就可以通过更换接口的实现类来更换系统的实现public class UCSSchool2 implements Introduceable public class UCSSchool2 implements Introduceable private Printer printer = new Printer(); private Printer pr

17、inter = new Printer();public String detail() public String detail() return “return “这里是中信培训中心; /使用(shyng)(shyng)中心打印机打印信息public void print(Introduceable intro) public void print(Introduceable intro) printer.print(intro.detail();printer.print(intro.detail(); 第16页/共47页第十六页,共48页。面向(min xin)接口编程第一步能否在前面

18、(qin mian)的安例上添加黑白或彩色打印功能采用面向接口编程的方式实现,以下是三个步骤中的第一步:抽象出JavaJava接口1 1、分析:黑白、彩色打印机都存在一个共同的方法(fngf)(fngf)特征:printprint黑白、彩色打印机对printprint方法(fngf)(fngf)有各自不同的实现public interface PrinterFace public interface PrinterFace public void print(String public void print(String content);content); 第17页/共47页第十七页,共48

19、页。面向(min xin)接口编程第二步采用面向(min xin)接口编程的方式实现,以下是三个步骤中的第二步:实现Java接口:结论:黑白、彩色打印机都实现PrinterFace接口,各自实现print方法public class ColorPrinter public class ColorPrinter implements implements PrinterFace PrinterFace public void print(String public void print(String content) content) System.out.println( System.out

20、.println(彩色(cis)(cis)打印:);); System.out.println(content); System.out.println(content); public class BlackPrinter public class BlackPrinter implements implements PrinterFace PrinterFace public void print(String public void print(String content) content) System.out.println( System.out.println(黑白打印:);)

21、; System.out.println(content); System.out.println(content); 第18页/共47页第十八页,共48页。面向(min xin)接口编程第三步采用面向接口编程的方式实现,以下(yxi)是三个步骤中的第三步:使用 3 3、具体(jt)(jt)实现:public class MySchool3 implements Introduceablepublic class MySchool3 implements Introduceable private PrinterFace printer; / private PrinterFace print

22、er; /打印机 public void setPrinter(PrinterFace p) public void setPrinter(PrinterFace p) this.printer = p; this.printer = p; public String detail() public String detail() return return 这里是中; public void print(Introduceable intro) public void print(Introduceable intro) printer.print(intro.detail(); print

23、er.print(intro.detail(); public class Test public class Test public static void main(String args) public static void main(String args) / / 创建中心实例 AccpSchool3 school=new AccpSchool3();AccpSchool3 school=new AccpSchool3(); / /为该中心配备黑白打印机 school.setPrinter(new BlackPrinter();school.setPrinter(new Black

24、Printer(); school.print(school); school.print(school); / /为该中心配备彩色打印机 school.setPrinter(new ColorPrinter();school.setPrinter(new ColorPrinter(); school.print(school); school.print(school); 第19页/共47页第十九页,共48页。现场编程收作业(zuy)的问题如老师如老师(losh)和学员都可以收作业,和学员都可以收作业,那么收作业的方法应该放在哪个类?那么收作业的方法应该放在哪个类?A:Teacher类类B:

25、Student类类C:两个两个(lin )都放都放D:Person类类E:重新定义重新定义造成代码冗余造成代码冗余如果增加一个工程师类,他不会收作业如果增加一个工程师类,他不会收作业如果继承这个类,如果继承这个类,Person类怎么办类怎么办?调用收作业的方法不需调用收作业的方法不需要改变要改变自定义一个接口来实现自定义一个接口来实现IHomeworkCollector第20页/共47页第二十页,共48页。现场(xinchng)编程第21页/共47页第二十一页,共48页。收作业(zuy)的问题public interface IHomeworkCollectorpublic interface

26、 IHomeworkCollector void CollectHomework(); void CollectHomework(); public class Student public class Student extends extends PersonPerson implements implements IHomeworkCollectorIHomeworkCollectorpublic void CollectHomework()public void CollectHomework() MessageBox.Show( MessageBox.Show(报告老师!作业(zuy

27、)(zuy)收集完毕!);); 1 1、定义(dngy)(dngy)一个收作业的接口2 2、在有收作业功能的类实现该接口3 3、不同的类收作业方式不同第22页/共47页第二十二页,共48页。作为(zuwi)返回值和参数的意义接口作为(zuwi)参数传递了实现接口的对象 接口作为(zuwi)返回值 返回一个实现了接口的对象第23页/共47页第二十三页,共48页。接口(ji ku)和抽象类比较派生类必须实现未实现的方法包含未实现的方法不能实例化相似点指定定义常量可以定义成员变量实现接口的类必须实现所有成员非抽象派生类必须实现抽象方法可以实现多个接口只能继承一个类用 interface interf

28、ace 定义用 abstract abstract 定义不同点接口抽象类第24页/共47页第二十四页,共48页。小结(xioji)public interface Introduceable public interface Introduceable public String detail();public String detail();public void introduction()public void introduction()detail();detail(); private void showMessage();private void showMessage();vo

29、id speak();void speak(); JavaJava接口(ji ku)(ji ku)中的方法必须是publicpublicJavaJava接口(ji ku)(ji ku)中不能有方法体实现 编译器会自动加上publicpublic修饰符请指出下列JavaJava代码中的错误。第25页/共47页第二十五页,共48页。为什么需要(xyo)常量生活中,一周有七天,如何(rh)用代码表示?public class Week public class Week private int days = 7;private int days = 7;public static void main

30、(String args) public static void main(String args) Week w = new Week();Week w = new Week();System.out.println(System.out.println(一周(y zhu)(y zhu)有+w.days+w.days+天);); public class Week public class Week private int days = 7;private int days = 7;public static void main(String args) public static void

31、 main(String args) Week w = new Week();Week w = new Week();w.days +;w.days +;System.out.println(System.out.println(一周有+w.days+w.days+天);); 一周有一周有7天天控制台输出控制台输出v然而,总有不尽人意的事情发生:一周有8 8天控制台输出如何保证变量的值在运行期无法被改变?使用常量 第26页/共47页第二十六页,共48页。什么(shn me)是常量常量是一种(y zhn)标识符,它的值在运行期间恒定不变常量标识符在程序中只能被引用,而不能被重新赋值常量常量圆周率

32、圆周率PIPI圆周率圆周率PIPI代码表示代码表示方式方式public public static finalstatic final double double PIPI = = 3.14159265358979323846;3.14159265358979323846;用法用法将将angang角度转换成径度角度转换成径度 public static double toRadians(double ang) public static double toRadians(double ang) return ang / 180.0 * return ang / 180.0 * PIPI; ;

33、第27页/共47页第二十七页,共48页。关键字final许多编程语言都提供了某种方法,来向编译器告知一个数据是恒定不变的。比如:一个永不改变的“编译时常量”一个在运行时被初始化的值,而你不希望它被改变。在java语言中使用final关键字达到此目标final变量基本数据类型使用final:数值(shz)恒定不变引用数据类型使用final:引用恒定不变final方法:方法不被覆盖final类:类不被继承第28页/共47页第二十八页,共48页。关键字staticfinal可以定义常量吗?回顾static的用法?关键字static告诉编译器,只分配一次内存空间。静态(jngti)的只能访问静态(jn

34、gti)的,非静态(jngti)的可以访问一切。不能在静态(jngti)方法中使用this关键字。第29页/共47页第二十九页,共48页。常量(chngling)的优点如果不使用常量,直接在程序中填写数字或字符串,将会有什么(shn me)麻烦?public static double toRadians(double ang) public static double toRadians(double ang) return ang / 180.0 * return ang / 180.0 * 3.141592653589793238463.14159265358979323846; ; p

35、ublic static double toDegrees(double ang) public static double toDegrees(double ang) return ang * 180.0 / return ang * 180.0 / 3.141592653589793238463.14159265358979323846; ; public public staticstatic final double PI = 3.14159265358979323846; final double PI = 3.14159265358979323846; / / 圆周率public

36、static double toRadians(double ang) public static double toRadians(double ang) return ang / 180.0 * PI;return ang / 180.0 * PI; public static double toDegrees(double ang) public static double toDegrees(double ang) return ang * 180.0 / PI;return ang * 180.0 / PI; 程序的可读性变差:用户(y(y nghngh ) )很难理解数字或字符串的

37、意思程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错使用常量可以增强程序的可读性、可维护性第30页/共47页第三十页,共48页。Java中常量的定义(dngy)规则加入final 关键字代表常量, 加入static 关键字代表类变量尽量使用(shyng)含义直观的常量来表示那些将在程序中多次出现的数字或字符串public class AccpStudent public class AccpStudent public static final int FEMALE = 1; /public static final int FEMALE = 1; /代表(dibio)(

38、dibio)女性public static final int MALE = 2; /public static final int MALE = 2; /代表(dibio)(dibio)男性private int sex; /private int sex; /性别public void setSex(int sex) public void setSex(int sex) if(sex=FEMALE)if(sex=FEMALE)System.out.println(System.out.println(这是一名女学生););else if(sex = MALE)else if(sex =

39、MALE)System.out.println(System.out.println(这是一名男学生););this.sex = sex;this.sex = sex;第31页/共47页第三十一页,共48页。在Java接口中声明(shngmng)常量在Java 接口中声明的变量在编译时会自动加上static final的修饰符,即声明为常量,因而Java接口通常(tngchng)是存放常量的最佳地点public interface AccpSchoolType public interface AccpSchoolType public static final String SCHOOL =

40、 “ public static final String SCHOOL = “软件(run (run jin)jin)培训中心; public static final String CITY = “ public static final String CITY = “长沙林科大; public public interfaceinterface AccpSchoolType AccpSchoolType String SCHOOL = “ String SCHOOL = “软件培训中心; String CITY = “ String CITY = “长沙林科大; 等同于第32页/共47页

41、第三十二页,共48页。小结(xioji) 3(xioji) 3编写一个用于放置常量的Java接口Constants,具有(jyu)常量MAX和MIN编写一个测试类ConstantsTest,在main方法中求取Constants中的两个常量之差第33页/共47页第三十三页,共48页。内部(nib)类内部(nib)类(inner class):允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”称为“内部(nib)类”(inner class),也称为“类属类”这样的一组类在逻辑上是一个整体,内部(nib)类和外层封装它的类之间存在逻辑上的从属关系内部(nib)类对其封装类的内部(ni

42、b)成员有访问权限为什么需要内部(nib)类?内部(nib)类方法可以访问外部类中定义的有的数据,包私有数据。内部(nib)类可以对同一个包中的其他类隐藏起来。当想要定义一个回调函数且不想编写大量代码时,使用匿名内部(nib)类比较便捷。第34页/共47页第三十四页,共48页。内部(nib)类特性内部(nib)类可以声明为抽象类 ,因此可以被其它的内部(nib)类继承。也可以声明为final的。内部(nib)类可以声明为private或protected。内部(nib)类可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量;非static的内部(nib)类中的成员不

43、能声明为static的,只有在顶层类或static的内部(nib)类中才可声明static成员。第35页/共47页第三十五页,共48页。内部(nib)(nib)类( Inner class Inner class )的种类实例(shl)内部类:和普通类一样,只是定义在另一个类中。静态内部类:加有关键字static的内部类。局部内部类:定义在一个方法中的内部类。匿名内部类:没有具体类名的内部类。第36页/共47页第三十六页,共48页。内部(nib)类的例子public class Outer1 public class Outer1 private int size; private int s

44、ize; /* /* 定义一个内部类,名为 Inner */ Inner */ public class Inner public class Inner public void doStuff() public void doStuff() / / 内部类可以访问外部类的私有(syu)(syu)属性 size+; size+; public void testTheInner() public void testTheInner() Inner i = new Inner(); Inner i = new Inner(); i.doStuff(); i.doStuff(); 第37页/共47

45、页第三十七页,共48页。实例(shl)化内部类实例化内部类的两种方法:法一: Outer.Inner in=new Outer().new Inner();法二:Outer o=new Outer();Outer.Inner I=new o.new Inner();如果内部类是static的,也可以(ky)用下面方法:Outer.Inner in=new Outer.Inner();第38页/共47页第三十八页,共48页。内部(nib)类类的名字只能在定义的范围内使用,除非(chfi)使用有效的全名内部类也可以定义在方法的内部。方法中final类型的局部变量,都可以被Inner类的方法访问。第

46、39页/共47页第三十九页,共48页。修饰符适用范围classclass属性属性方法方法构建器构建器自由块自由块内部类内部类publicpublicY YY YY YY YY Yprotected protected Y YY YY YY Y(Default)(Default)Y YY YY YY YY YY YprivateprivateY YY YY YY YfinalfinalY YY YY YY YabstractabstractY YY YY YstaticstaticY YY YY Y第40页/共47页第四十页,共48页。OOPOOP的三大(sn d)(sn d)特性总结OOOO基

47、本基本特征特征定义定义具体实现方式具体实现方式优势优势封装封装隐藏实现细节,对外提隐藏实现细节,对外提供公共的访问接口供公共的访问接口属性私有化、添加公有属性私有化、添加公有的的settersetter、gettergetter方法方法增强代码的安增强代码的安全性全性继承继承从一个已有的类派生出从一个已有的类派生出新的类,子类具有父类新的类,子类具有父类的一般特性,以及自身的一般特性,以及自身特殊的特性特殊的特性继承需要符合的关系:继承需要符合的关系:is-ais-a1 1、实现抽象、实现抽象(抽出像的部(抽出像的部分)分)2 2、增强代码的、增强代码的可复用性可复用性多态多态同一个实现接口,

48、使用同一个实现接口,使用不同的实例而执行不同不同的实例而执行不同操作操作通过通过JavaJava接口接口/ /继承来定继承来定义统一的实现接口;通义统一的实现接口;通过方法重写为不同的实过方法重写为不同的实现类现类/ /子类定义不同的操子类定义不同的操作作增强代码的可增强代码的可扩展性、可维扩展性、可维护性护性第41页/共47页第四十一页,共48页。什么(shn me)是设计模式模式就是得到很好研究的范例设计模式是软件开发过程中经验(jngyn)的积累特定问题的经过实践检验的特定解决方法走为上走为上 围魏救赵围魏救赵(wi wi ji zho) 声东击西声东击西 第42页/共47页第四十二页,

49、共48页。单例模式(msh)Singleton(msh)Singleton单例模式结果(ji gu):类的实例永远只有一个做法:将类的构造函数设置成private外部不能使用。在类的内部定义一个静态的本类型的成员变量保存创建的对象提供一个静态的方法给外部使用(返回对象)。对象的hashcode人的身份证号码hashcode就是对象的身份标识对象的唯一标识第43页/共47页第四十三页,共48页。简单工厂(gngchng)模式简单( jindn)工厂设计模式父类产品父类产品 子类产品子类产品A 子类产品子类产品B 子类产品子类产品C 工厂工厂 客户客户 第44页/共47页第四十四页,共48页。简单

50、(jindn)工厂案例用简单(jindn)工厂方式重构前面收作业程序。模拟一汽汽车公司为客户生产汽车。第45页/共47页第四十五页,共48页。总结(zngji)向接口(ji ku)编写程序代码带来什么样的好处?接口(ji ku)与抽象类的区别?Final和static关键字的的特点?什么是设计模式?单例设计模式用在什么场合,简单工厂模式用在什么场合?第46页/共47页第四十六页,共48页。感谢您的欣赏(xnshng)!第47页/共47页第四十七页,共48页。内容(nirng)总结掌握Java接口。使用USB接口必须符合USB规范。接口是一套规范,遵守这个规范就可以实现功能。return 本人是CSU教员。return 这里是CSU中心(zhngxn)。使用了Java接口之后,这个系统有了怎样的改进。school.print(school)。现场编程收作业的问题。非抽象派生类必须实现抽象方法。引用数据类型使用final:引用恒定不变。if(sex=FEMALE)。感谢您的欣赏第四十八页,共48页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号