ch面向对象编程面向接口PPT课件_第1页
ch面向对象编程面向接口PPT课件_第2页
ch面向对象编程面向接口PPT课件_第3页
ch面向对象编程面向接口PPT课件_第4页
ch面向对象编程面向接口PPT课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章节:面向对象编程第六章节:面向对象编程接口与设计模式第1页/共48页回顾举例说明在什么样的情况下,需要使用到继承?在Java程序中,多态带给我们的好处是什么?第2页/共48页 掌握Java接口 理解Java接口与多态的关系 掌握面向接口编程的思想 掌握常量接口的使用 设计模式本章目标第3页/共48页单一继承的局限性1 1、如下的类图描述正确吗?2 2、青蛙是两栖动物,怎么办呢?我该何处何从我该何处何从第4页/共48页什么是JavaJava接口 接口与前面所学的抽象类一样是一种规范和标准、可以约束类的行为 定义一个接口不指定具体的实现 一个Java接口是一些方法特征的集合,但没有方法的实现

2、JavaJava接口中定义的方法在不同的地方被实现,可以具有完全不同的行为第5页/共48页一个例子第6页/共48页一个实例public interface PCI public interface PCI public void public void start(); start(); public void stop(); public void stop(); class SoundCard implements PCI class SoundCard implements PCI public void start() public void start() System.out.pr

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

4、(Send.); System.out.println(Send.); public void stop() public void stop() System.out.println(Network System.out.println(Network stop!);stop!); 声卡、网卡都实现了PCIPCI插槽的规范,但行为完全不同 第7页/共48页一个实例public class Assembler public class Assembler public static void main(String public static void main(String args) ar

5、gs) 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接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现Du du.Du du.Send.Send.控制台输出2 21 1第8页/共48页生活中的接口USB接口接口使用使用USB接口必须接口必须符合符合USB规范规范接口是一套规范,遵守这个规范就可以实

6、现功能接口是一套规范,遵守这个规范就可以实现功能 第9页/共48页接口的特点JAVAJAVA中一个类能否继承多个父类?v 接口:接口: 接口可以说是对继承单根性的扩展接口可以说是对继承单根性的扩展 接口提供了一组规范、一个标准接口提供了一组规范、一个标准 接口屏蔽了实现的细节接口屏蔽了实现的细节 方便多人协同开发方便多人协同开发v 特点:特点: 接口不能被实例化接口不能被实例化 不管是否标识,接口中所有方法都是抽象的,公共的。不管是否标识,接口中所有方法都是抽象的,公共的。 接口中只能定义常量接口中只能定义常量第10页/共48页用接口实现让我们为青蛙找一个合法的身份?让我们为青蛙找一个合法的身

7、份? 第11页/共48页JAVAJAVA接口 开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下: 教员、以及中心都具有方法:输出详细信息 中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息 系统要具备良好的可扩展性与可维护性打印打印 教员教员 中心中心 教员教员详细信息详细信息中心中心详细信息详细信息detail方法方法(输出详细信息)(输出详细信息)第12页/共48页JAVAJAVA接口 以下这个解决方案中存在着什么问题?public class UCSTeacher1 public class UCSTeacher1 / /输出教员的详细信息public St

8、ring detail() public String detail() return return 本人是CSUCSU教员; public class UCSSchool1 public class UCSSchool1 private Printer printer = new private Printer printer = new Printer();Printer(); / /输出中心的详细信息public String detail() public String detail() return return 这里是CSUCSU中心; /使用打印机打印教员信息public voi

9、d print(UCSTeacher1 t)public void print(UCSTeacher1 t)printer.print(t.detail();printer.print(t.detail(); /使用打印机打印中心信息public void print(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 con

10、tent) public void print(String content) System.out.println(System.out.println( 开始打印:););System.out.println(content);System.out.println(content); 每增加一种新类型,都需要增加相应的print(print(类型名称 var)var)方法程序的可扩展性及可维护性极差这不符合系统的要求第13页/共48页用Java接口重构项目 v 在这个系统中,存在继承关系吗?在这个系统中,存在继承关系吗? 教员、中心属于两种不同的类型,无法通过教员、中心属于两种不同的类型,

11、无法通过“is-a”is-a”找到一找到一个合适的父类个合适的父类v 教员、中心都存在一个共同的方法特征:教员、中心都存在一个共同的方法特征:detaildetail,它,它们对们对detaildetail方法有各自不同的实现方法有各自不同的实现这完全符合这完全符合JavaJava接口的定义接口的定义第14页/共48页类图定义一个JavaJava接口,在其中定义detaildetail方法,但没有具体实现实现这个JavaJava接口,不同的类对detaildetail方法有不同的具体实现第15页/共48页使用了Java接口之后,这个系统有了怎样的改进?JavaJava接口重构之后public

12、interface IPrintable public interface IPrintable public String detail();public String detail(); public class UCSSchool2 public class UCSSchool2 implements implements IntroduceableIntroduceable private Printer printer = new private Printer printer = new Printer();Printer(); / /输出中心的详细信息public String

13、detail() public String detail() return “return “这里是中信培训中心; /使用中心打印机打印信息public void print(public void print(IPrintable IPrintable intro) intro) printer.print(intro.detail();printer.print(intro.detail(); public class UCSTeacher2 public class UCSTeacher2 implements implements IPrintableIPrintable / /输出

14、教员的详细信息public String detail() public String detail() return “return “本人是中信教员; 通过JavaJava接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性 使用printprint方法时,参数可以是任何IntroduceableIntroduceable接口的实现类的对象,不必再为不同的类型建立不同的printprint方法了第16页/共48页接口作为参数 接口描述了一个对象的特征 传递接口就是传递了实现接口的对象public class SxtSchool2 public class SxtScho

15、ol2 /使用中心打印机打印信息public void print(Introduceable public void print(Introduceable intro) intro) printer.print(intro.detail();printer.print(intro.detail(); 第17页/共48页什么是面向接口编程 开发系统时,主体构架使用接口,接口构成系统的骨架 这样就可以通过更换接口的实现类来更换系统的实现public class UCSSchool2 implements Introduceable public class UCSSchool2 impleme

16、nts Introduceable private Printer printer = new Printer(); private Printer printer = new Printer();public String detail() public String detail() return “return “这里是中信培训中心; /使用中心打印机打印信息public void print(Introduceable intro) public void print(Introduceable intro) printer.print(intro.detail();printer.p

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

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

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

20、em.out.println(content); System.out.println(content); 第20页/共48页面向接口编程第三步 采用面向接口编程的方式实现,以下是三个步骤中的第三步:使用 3 3、具体实现:public class MySchool3 implements Introduceablepublic class MySchool3 implements Introduceable private PrinterFace printer; / private PrinterFace printer; /打印机 public void setPrinter(Print

21、erFace 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(); printer.print(intro.detail(); public class

22、 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 BlackPrinter(); school.print(school); scho

23、ol.print(school); / /为该中心配备彩色打印机 school.setPrinter(new ColorPrinter();school.setPrinter(new ColorPrinter(); school.print(school); school.print(school); 第21页/共48页现场编程收作业的问题如老师和学员都可以收作业,如老师和学员都可以收作业,那么收作业的方法应该放在哪个类?那么收作业的方法应该放在哪个类?A:Teacher类类B:Student类类C:两个都放两个都放D:Person类类E:重新定义重新定义造成代码冗余造成代码冗余如果增加一个工

24、程师类,他不会收作业如果增加一个工程师类,他不会收作业如果继承这个类,如果继承这个类,Person类怎么办类怎么办?调用收作业的方法不调用收作业的方法不需要改变需要改变自定义一个接口来实现自定义一个接口来实现IHomeworkCollector第22页/共48页现场编程第23页/共48页收作业的问题public interface IHomeworkCollectorpublic interface IHomeworkCollector void CollectHomework(); void CollectHomework(); public class Student public cla

25、ss Student extends extends PersonPerson implements implements IHomeworkCollectorIHomeworkCollectorpublic void CollectHomework()public void CollectHomework() MessageBox.Show( MessageBox.Show(报告老师!作业收集完毕!);); 1 1、定义一个收作业的接口2 2、在有收作业功能的类实现该接口3 3、不同的类收作业方式不同第24页/共48页作为返回值和参数的意义 接口作为参数 传递了实现接口的对象 接口作为返回值

26、 返回一个实现了接口的对象第25页/共48页接口和抽象类比较派生类必须实现未实现的方法包含未实现的方法不能实例化相似点指定定义常量可以定义成员变量实现接口的类必须实现所有成员非抽象派生类必须实现抽象方法可以实现多个接口只能继承一个类用 interface interface 定义用 abstract abstract 定义不同点接口抽象类第26页/共48页小结public interface Introduceable public interface Introduceable public String detail();public String detail();public void

27、 introduction()public void introduction()detail();detail(); private void showMessage();private void showMessage();void speak();void speak(); JavaJava接口中的方法必须是publicpublicJavaJava接口中不能有方法体实现 编译器会自动加上publicpublic修饰符请指出下列请指出下列JavaJava代码中的错误。代码中的错误。第27页/共48页为什么需要常量 生活中,一周有七天,如何用代码表示?public class Week pu

28、blic class Week private int days = 7;private int days = 7;public static void main(String args) public static void main(String args) Week w = new Week();Week w = new Week();System.System.outout.println(.println(一周有+w.days+w.days+天);); public class Week public class Week private int days = 7;private i

29、nt days = 7;public static void main(String args) public static void 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天控制台输出如何保证变量的值在运行期无法被改变?使用常量 第28页/共48

30、页什么是常量 常量是一种标识符,它的值在运行期间恒定不变 常量标识符在程序中只能被引用,而不能被重新赋值常量常量圆周率圆周率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(dou

31、ble ang) return ang / 180.0 return ang / 180.0 * * PIPI; ; 第29页/共48页关键字final 许多编程语言都提供了某种方法,来向编译器告知一个数据是恒定不变的。比如: 一个永不改变的“编译时常量” 一个在运行时被初始化的值,而你不希望它被改变。 在java语言中使用final关键字达到此目标 final变量 基本数据类型使用finalfinal:数值恒定不变 引用数据类型使用finalfinal:引用恒定不变 final方法:方法不被覆盖 final类:类不被继承第30页/共48页关键字static final可以定义常量吗? 回顾s

32、tatic的用法? 关键字static告诉编译器,只分配一次内存空间。 静态的只能访问静态的,非静态的可以访问一切。 不能在静态方法中使用this关键字。第31页/共48页常量的优点 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?public static double toRadians(double ang) public static double toRadians(double ang) return ang / 180.0 return ang / 180.0 * * ; ; public static double toDegrees(double ang) pu

33、blic static double toDegrees(double ang) return ang return ang * * 180.0 / ; 180.0 / ; public public staticstatic / / 圆周率public static double toRadians(double ang) public static double toRadians(double ang) return ang / 180.0 return ang / 180.0 * * PI; PI; public static double toDegrees(double ang)

34、public static double toDegrees(double ang) return ang return ang * * 180.0 / PI; 180.0 / PI; 程序的可读性变差:用户很难理解数字或字符串的意思程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错使用常量可以增强程序的可读性、可维护性第32页/共48页Java中常量的定义规则 加入final 关键字代表常量, 加入static 关键字代表类变量 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串public class AccpStudent public class Ac

35、cpStudent public static final int FEMALE = 1; /public static final int FEMALE = 1; /代表女性public static final int MALE = 2; /public static final int MALE = 2; /代表男性private int sex; /private int sex; /性别public void setSex(int sex) public void setSex(int sex) if(sex=FEMALE)if(sex=FEMALE)System.out.print

36、ln(System.out.println(这是一名女学生););else if(sex = MALE)else if(sex = MALE)System.out.println(System.out.println(这是一名男学生););this.sex = sex;this.sex = sex;第33页/共48页在Java接口中声明常量 在Java 接口中声明的变量在编译时会自动加上static final的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点public public interfaceinterface AccpSchoolType AccpSchoolTyp

37、e public static final String SCHOOL = “ public static final String SCHOOL = “软件培训中心; public static final String CITY = “ public static final String CITY = “长沙林科大; public public interfaceinterface AccpSchoolType AccpSchoolType String SCHOOL = “ String SCHOOL = “软件培训中心; String CITY = “ String CITY = “

38、长沙林科大; 等同于第34页/共48页小结 3 3 编写一个用于放置常量的Java接口Constants,具有常量MAX和MIN 编写一个测试类ConstantsTest,在main方法中求取Constants中的两个常量之差第35页/共48页内部类 内部类(inner class):允许一个类的定义出现在另一个类中,将处于另一个类中的“寄生类”称为“内部类”(inner class),也称为“类属类” 这样的一组类在逻辑上是一个整体,内部类和外层封装它的类之间存在逻辑上的从属关系 内部类对其封装类的内部成员有访问权限 为什么需要内部类? 内部类方法可以访问外部类中定义的有的数据,包私有数据。

39、 内部类可以对同一个包中的其他类隐藏起来。 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。第36页/共48页内部类特性 内部类可以声明为抽象类 ,因此可以被其它的内部类继承。也可以声明为final的。 内部类可以声明为private或protected。 内部类可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量; 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。第37页/共48页内部类( Inner class Inner class )的种类 实例内部类:和普通类一样,只

40、是定义在另一个类中。 静态内部类:加有关键字static的内部类。 局部内部类:定义在一个方法中的内部类。 匿名内部类:没有具体类名的内部类。第38页/共48页内部类的例子public class Outer1 public class Outer1 private int size; private int size; / /* * 定义一个内部类,名为 Inner Inner * */ / public class Inner public class Inner public void doStuff() public void doStuff() / / 内部类可以访问外部类的私有属性

41、 size+;size+; public void testTheInner() public void testTheInner() Inner i = new Inner(); Inner i = new Inner(); i.doStuff(); i.doStuff(); 第39页/共48页实例化内部类 实例化内部类的两种方法: 法一: Outer.Inner in=new Outer().new Inner();Outer.Inner in=new Outer().new Inner(); 法二:Outer o=new Outer();Outer o=new Outer();Outer.Inner I=new o.new Inner();O

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论