1、抽象类和接口 学完本次课程后,你能够:了解抽象类和普通类的区别会使用抽象类会定义抽象方法会定义接口会运用接口解决实际问题本课目标2/28抽象类与抽象方法2-1 回顾如下代码 抽象类VS普通类抽象类不能被实例化但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例普通类可以被实例化 抽象方法VS普通方法有无方法体public abstract class Pet public abstract void toHospital();抽象类抽象类抽象方法抽象方法想一想:想一想:Why?3/28抽象类与抽象方法2-2 抽象类与抽象方法的使用抽象类中可以没有抽象方法,但包含了抽象方法的类必须被
2、定义为抽象类如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类没有抽象构造方法,也没有抽象静态方法抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用演示示例演示示例1 1:抽象类与抽象方法的使用:抽象类与抽象方法的使用4/28为什么使用接口 要求实现防盗门的功能 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能 将门和锁分别定义为抽象类防盗门可以继承门的同时又继承锁吗?防盗门可以继承门的同时又继承锁吗?如何解决这个问题呢?如何解决这个问题呢?将门定义为抽象类,锁定义为接口 防盗门继承门,实现锁的接口问题分析5/28什么是接口 认识一下接口 必须知道的接口特性接口不可以被实例
3、化实现类必须实现接口的所有方法实现类可以实现多个接口implements、多个接口使用逗号隔开 接口中的变量都是静态常量(public static final)public interface MyInterface public void foo();/其他方法其他方法所有方法默认都是:所有方法默认都是:public abstractJava中的多继承中的多继承 常作为类型使用常作为类型使用 6/28如何使用接口 用程序描述USB接口7/28问题如何使用接口 可以使用Java接口来实现USB接口本身没有实现任何功能接口本身没有实现任何功能 USB接口规定了数据传输的要求接口规定了数据传输的
4、要求USB接口可以被多种接口可以被多种USB设备实现设备实现 编写编写USB接口接口 实现实现USB接口接口 使用使用USB接口接口 根据需求设计方法根据需求设计方法实现所有方法实现所有方法用多态的方式使用用多态的方式使用 演示示例演示示例2 2:USBUSB接口接口分析8/28接口表示一种能力“做这项工作需要一个钳工(木匠/程序员)”接口是一种能力 面向接口编程 关心实现类有何能力,而不关心实现细节关心实现类有何能力,而不关心实现细节 钳工是一种钳工是一种“能力能力”,不关心具体是谁,不关心具体是谁 体现在接口的方法上体现在接口的方法上 面向接口的约定而不考虑接口的具体实现面向接口的约定而不
5、考虑接口的具体实现 程序程序设计时设计时 9/28面向接口编程3-1 实现防盗门功能 防盗门是一个门 防盗门有一个锁上锁开锁能力能力isis a a的的关系关系has ahas a的关系的关系分析问题10/28面向接口编程3-2 实现过程定义定义Lock接口接口具备上锁、具备上锁、开锁的能力开锁的能力具有开门、具有开门、关门的功能关门的功能编写编写TheftproofDoor类类继承类实现接口继承类实现接口编写测试类编写测试类让防盗门关门、让防盗门关门、上锁、开锁、开门上锁、开锁、开门定义定义Door 抽象类抽象类演示演示示例示例3 3:防盗门功能防盗门功能11/28面向接口编程3-3 扩展防
6、盗门门铃功能,主要实现拍照存档一个人可以具有多项能力一个人可以具有多项能力一个类可以实现多个接口一个类可以实现多个接口 问题演示演示示例示例4 4:防盗门扩展功能防盗门扩展功能12/28练习1:接口实现手机 需求说明原始的手机,可以发短信,通电话。随着发展,手机增加了功能:音频、视频播放、拍照、上网。使用接口实现手机功能13/28练习1:接口实现手机 实现思路编写类及接口,参照以下类的结构图编写测试类,让普通手机播放音频、发信息和通电话,让智能手机上网、播放视频、照相、发信息和通电话照相照相连接网络连接网络普通手机普通手机播放播放智能手机智能手机手机手机14/28接口是一种约定 生活中,我们使
7、用的两相电源插座,规定了:两个接头间的额定电压两个接头间的距离接头的形状 接口是一种约定 面向接口编程 程序设计时面向接口的约定而不考虑具体实现程序设计时面向接口的约定而不考虑具体实现 有些接口只有名称有些接口只有名称15/28面向接口编程 开发打印机墨盒:彩色、黑白纸张类型:A4、B5墨盒和纸张都不是打印机厂商提供的打印机厂商要兼容市场上的墨盒、纸张16/28面向接口编程 墨盒和纸张的规格是一种约定 打印机需要遵守这些约定 用面向接口编程的方式开发制定墨盒、纸张的约定或标准其他厂商按照墨盒、纸张的标准生产墨盒、纸张打印机厂商使用墨盒、纸张的标准开发打印机定义墨盒接口定义墨盒接口InkBox定
8、义纸张接口定义纸张接口Paper 定义打印机类定义打印机类 实现墨盒接口实现墨盒接口实现纸张接口实现纸张接口 约定墨盒标准约定墨盒标准约定纸张标准约定纸张标准演示演示示例示例5 5:打印机打印机17/28练习2:组装一台计算机 需求说明采用面向接口编程思想组装一台计算机计算机的主要组成部分CPU硬盘内存18/28练习2:组装一台计算机 实现思路定义CPU的接口CPU,返回CPU品牌和主频定义内存的接口EMS,返回类型和容量定义硬盘的接口HardDisk,返回容量编写各组件厂商分别实现CPU、EMS、和HardDisk接口编写计算机类,组装计算机并显示相关信息编写测试类运行19/28接口使用 接
9、口中的成员变量默认都是public static final的,必须显式初始化 接口中的方法默认都是public abstract的 接口没有构造方法,不能被实例化 一个接口不能实现另一个接口,但可以继承多个其他接口 一个类必须实现接口抽象方法(implements),除非这个类也是抽象类20/28小结 阅读代码,找出错误public interface MyInterface public MyInterface();public void method1();public void method2()private void method3();void method4();int met
10、hod5();int TYPE=1;21/28抽象类vs接口 相同点代表系统的抽象层都不能被实例化都能包含抽象方法用于描述系统提供的服务,不必提供具体实现 不同点在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法抽象类便于复用,接口便于代码维护一个类只能继承一个直接的父类,但可以实现多个接口22/28抽象类vs接口 使用原则接口做系统与外界交互的窗口接口提供服务接口本身一旦制定,就不允许随意修改抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点23/28面向对象设计原则 多用组合,少用继承 针对接口编程 针对扩展开放,针对改变关闭24/28总结 Java中的接口属性全都是全局静态常量方法都是全局抽象方法无构造方法 一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法 抽象类利于代码复用,接口利于代码维护25/28问题及作业集中问题&课后作业26/28