面向对象的Java实现-接口.ppt_第1页
面向对象的Java实现-接口.ppt_第2页
面向对象的Java实现-接口.ppt_第3页
面向对象的Java实现-接口.ppt_第4页
面向对象的Java实现-接口.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

面向对象的Java实现-接口,第八章,2,回顾,举例说明在什么样的情况下,需要使用到继承? 在Java程序中,多态性带给我们的好处是什么?,3,预习检查,什么是常量?Java中,常量的定义规则有哪些? 什么是面向接口编程,它的好处是什么?,4,本章任务,升级HelloACCP,打印ACCP中心与教员的详细信息: 正确使用面向接口编程的思想 提高系统的可扩展性及可维护性,5,掌握Java接口 理解Java接口与多态的关系 掌握面向接口编程的思想 掌握常量接口的使用,本章目标,抽象类,可以使用abstract来修饰一个类和方法 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。 抽象类不能被实例化 抽象方法是只有方法声明,而没有实现的方法。 构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。,6,抽象类的例子,public abstract class Shape /*画出自己*/ public abstract void draw(); /*得到面积*/ public double getArea() return 100.0; ,7,抽象类(abstract class),抽象类里面并非一定需要抽象方法,但是没有抽象方法,抽象类就没有存在的必要 在以下任一条件成立时,类必须定义成抽象类: 类中有至少一个抽象方法 类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现 类实现了某个接口,但没有全部实现接口中的方法,8,创建抽象类的对象,抽象类不可实例化 如果从一个抽象类继承,并想创建该新类的对象,那么我们就必须为基类中的所有抽象方法提供方法定义。 如果不这样做(可以选择不做),那么抽象类的子类便也是抽象类,且编译器将会强制我们用abstract关键字来限制修饰这个类。 创建抽象类的对象 扩展抽象类,实现其所有抽象方法 创建该抽象类子类的对象,9,抽象类的使用例子,public class Circle extends Shape public void draw() System.out.println(“draw a circle“); TestShape.java public static void main(Stringargs) /Shape shape=new Shape();/error Shape shape=new Circle(); shape.draw(); System.out.println(shape.getArea(); ,10,接口(interface),接口(interface)比抽象(abstract)的概念向前更迈进了一步。你可以将它看作是“纯粹的”抽象类。 它允许类的创建者为一个类建立其形式:有方法名、参数列表和返回类型,但是没有任何方法体。接口也可以包含有数据成员。 接口只提供了形式,而未提供任何具体实现。 接口是方法和常量值的定义的集合。,11,接口的定义,修饰符interface接口名extends父接口名表 修饰符域类型域名常量值;/常量域声明 修饰符返回值方法名(参数表);/抽象方法声明 因为所有定义在接口中的常量都默认为public、 static和final。所有定义在接口中的方法默认为public 和abstract,所以可以不用修饰符限定它们。 和类不同的是,一个接口可以继承多个父接口.,12,接口例子,public interface IShape /面积 double area=100.0; /画出自己 void draw(); /得到面积 double getArea(); ,13,实现接口,多个无关的类可实现同一个接口。 一个类可实现多个无关的接口 语法如下: classextends implements,* * 在Java中,可以通过接口来模拟多继承,14,接口应用例子,public class Circle implements IShape public void draw() System.out.println(“draw a circle“); public double getArea() /area=200.0;error return area; Main: IShape shape=new Circle(); shape.draw(); System.out.println(shape.getArea();,15,实现接口注意事项,在类的声明部分,用implements关键字声明将要实现那些接口; 如果实现某接口的类不是abstract类,则在类的定义部分必须实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致; 如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法。但其非abstract的子类中必须有所有抽象方法的实在的方法体; 接口的抽象方法的访问控制符都已指定为public,因此,类在实现方法时,必须显式地使用public修饰符。否则,将缩小接口定义方法的访问控制范围。(报错),16,17,生活中的接口,电脑主板上的PCI插槽的规范就类似于Java接口,声卡,显卡,网卡,每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在PCI插槽上,而不用担心哪个插槽是专门插哪个卡的,主板,18,什么是Java接口 2-1,一个Java接口是一些方法特征的集合,但没有方法的实现,public interface PCI public void start(); public void stop(); ,class SoundCard implements PCI public void start() System.out.println(“Du du.“); public void stop() System.out.println(“Sound stop!“); ,Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为,这是Java接口,相当于主板上的PCI插槽的规范,class NetworkCard implements PCI public void start() System.out.println(“Send.“); public void stop() System.out.println(“Network stop!“); ,声卡、网卡都实现了PCI插槽的规范,但行为完全不同,19,什么是Java接口 2-2,public class Assembler public static void main(String args) PCI nc = new NetworkCard(); PCI sc = new SoundCard(); nc.start(); sc.start(); ,可以使用Java接口标识类型 运行时,根据实际创建的对象类型调用相应的方法实现,Du du. Send.,控制台输出,2,1,20,为什么需要Java接口 5-1,为ACCP各中心开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下: 教员、以及中心都具有方法:输出详细信息 中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息 系统要具备良好的可扩展性与可维护性,打印,教员,中心,教员 详细信息,中心 详细信息,detail方法 (输出详细信息),21,为什么需要Java接口 5-2,以下这个解决方案中存在着什么问题?,public class AccpTeacher1 /输出教员的详细信息 public String detail() return “本人是ACCP教员“; ,public class AccpSchool1 private Printer printer = new Printer(); /输出中心的详细信息 public String detail() return “这里是ACCP中心“; /使用打印机打印教员信息 public void print(AccpTeacher1 t) printer.print(t.detail(); /使用打印机打印中心信息 public void print(AccpSchool1 s) printer.print(s.detail(); ,public class Printer public void print(String content) System.out.println(“开始打印:“); System.out.println(content); ,每增加一种新类型,都需要增加相应的print(类型名称 var)方法 程序的可扩展性及可维护性极差 这不符合系统的要求,22,为什么需要Java接口 5-3,可以通过多态性解决这个问题吗?,显然,本系统符合使用多态性的条件,教员,中心,detail方法 (负责输出详细信息),教员 详细信息,中心 详细信息,1,2,2,1,回顾多态的含义: 实现同一个接口,使用不同的实例而执行不同操作,23,为什么需要Java接口 5-4,在这个系统中,存在继承关系吗? 教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类 教员、中心都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现这完全符合Java接口的定义,定义一个Java接口,在其中定义detail方法,但没有具体实现,实现这个Java接口,不同的类对detail方法有不同的具体实现,24,为什么需要Java接口 5-5,public interface Introduceable public String detail(); ,public class AccpSchool2 implements Introduceable private Printer printer = new Printer(); /输出中心的详细信息 public String detail() return “这里是ACCP中心“; /使用中心打印机打印信息 public void print(Introduceable intro) printer.print(intro.detail(); ,public class AccpTeacher2 implements Introduceable /输出教员的详细信息 public String detail() return “本人是ACCP教员“; ,通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性,使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了,使用了Java接口之后,这个系统有了怎样的改进?,25,小结 1,为刚才完成的系统增加一种新的类型:学员(AccpStudent),具体要求如下: 学员具有detail方法,负责输出学员详细信息 能够通过中心的打印机打印学员的详细信息 系统要具备良好的可扩展性与可维护性 编写测试类StudentTest进行测试,要求: 通过中心的打印机打印学员的详细信息,StudentTest完整代码实现,AccpStudent完整代码实现,26,什么是面向接口编程,开发系统时,主体构架使用接口,接口构成系统的骨架 这样就可以通过更换接口的实现类来更换系统的实现,public class AccpSchool2 implements Introduceable private Printer printer = new Printer(); public String detail() return “这里是ACCP中心“; /使用中心打印机打印信息 public void print(Introduceable intro) printer.print(intro.detail(); ,Introduceable,AccpTeacher2 (教员),AccpSchool2 (中心),27,面向接口编程的示例 4-1,升级上述的ACCP系统,要求: 打印机有多种类型,比如:黑白打印机、彩色打印机等 中心可能配备其中任意一款打印机,负责打印教员、或者中心的详细信息 系统要具备良好的可扩展性与可维护性,print方法 (打印),彩色打印机,黑白打印机,黑白内容,中心/教员 详细信息,彩色内容,28,面向接口编程的示例 4-2,采用面向接口编程的方式实现,以下是三个步骤中的第一步:,抽象出Java接口 1、分析: 黑白、彩色打印机都存在一个共同的方法特征:print 黑白、彩色打印机对print方法有各自不同的实现 2、结论: 抽象出Java接口PrinterFace,在其中定义方法print 3、具体实现:,public interface PrinterFace public void print(String content); ,29,面向接口编程的示例 4-3,采用面向接口编程的方式实现,以下是三个步骤中的第二步:,public class ColorPrinter implements PrinterFace public void print(String content) System.out.println(“彩色打印:“); System.out.println(content); ,public class BlackPrinter implements PrinterFace public void print(String content) System.out.println(“黑白打印:“); System.out.println(content); ,实现Java接口 1、分析: 已经抽象出Java接口PrinterFace,并在其中定义了print方法 黑白、彩色打印机对print方法有各自不同的实现 2、结论: 黑白、彩色打印机都实现PrinterFace接口,各自实现print方法 3、具体实现:,30,面向接口编程的示例 4-4,采用面向接口编程的方式实现,以下是三个步骤中的第三步:,使用Java接口 1、分析: 主体构架使用接口, 让接口构成系统的骨架 2、结论: 更换实现接口的类就可以更换系统的实现 3、具体实现:,public class AccpSchool3 implements Introduceable private PrinterFace printer; /打印机 public void setPrinter(PrinterFace p) this.printer = p; public String detail() return “这里是ACCP中心“; public void print(Introduceable intro) printer.print(intro.detail(); ,public class AccpTest public static void main(String args) / 创建中心实例 AccpSchool3 school=new AccpSchool3(); /为该中心配备黑白打印机 school.setPrinter(new BlackPrinter(); school.print(school); /为该中心配备彩色打印机 school.setPrinter(new ColorPrinter(); school.print(school); ,31,小结 2,阅读如下Java代码,然后请采用面向接口编程的思想,在空白处填写正确的代码,public interface PCI void start(); void stop(); ,class SoundCard implements PCI public void start() System.out.println(“Du du.“); public void stop() System.out.println(“Sound stop!“); ,class NetworkCard implements PCI public void start() System.out.println(“Send.“); public void stop() System.out.println(“Network stop!“); ,这是Java接口,相当于主板上的PCI插槽的规范,声卡、网卡都实现了PCI插槽的规范,但行为完全不同,32,小结 2,public class MainBoard public void usePCICard(_ p) p.start(); p.stop(); ,public class Assembler public static void main(String args) MainBoard mb=new MainBoard(); /在主板上插入网卡 /在主板上插入声卡 ,提示:通过这个方法,主板上可以插入任意符合PCI插槽规范的卡,PCI nc=new NetworkCard(); mb.usePCICard(nc);,PCI sc=new SoundCard(); mb.usePCICard(sc);,PCI,提示:可以通过更换实现接口的类来更换系统的实现,33,为什么需要常量,生活中,一周有七天,如何用代码表示?,public class Week private int days = 7; public static void main(String args) Week w = new Week(); System.out.println(“一周有“+w.days+“天“); ,public class Week private int days = 7; public static void main(String args) Week w = new Week(); w.days +; System.out.println(“一周有“+w.days+“天“); ,一周有7天,控制台输出,然而,总有不尽人意的事情发生:,一周有8天,控制台输出,如何保证变量的值在运行期无法被改变?使用常量,34,什么是常量,常量是一种标识符,它的值在运行期间恒定不变 常量标识符在程序中只能被引用,而不能被重新赋值,35,常量的优点,如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?,public static double toRadians(double ang) return ang / 180.0 * 3.14159265358979323846; public static double toDegrees(double ang) return ang * 180.0 / 3.14159265358979323846; ,public static final double PI = 3.14159265358979323846; / 圆周率 public static double toRadians(double ang) return ang / 180.0 * PI; public static double toDegrees(double ang) return ang * 180.0 / PI; ,程序的可读性变差:用户很难理解数字或字符串的意思,程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错,使用常量可以增强程序的可读性、可维护性,36,Java中常量的定义规则,加入final 关键字代表常量, 加入static 关键字代表类变量 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串,public class AccpStudent public static final int FEMALE = 1; /代表女性 public

温馨提示

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

评论

0/150

提交评论