第八章抽象类和接口第一单元第1页/共26页本章相关学习资源《抽象类和接口》专题《阶段练习——汽车租赁》专题《使用Java实现面向对象编程》第8章《抽象类和接口》学习平台“Java面向对象”课程学生用书第2页/共26页预习检查定义抽象类和抽象方法的关键字是什么?abstract定义接口的语法是什么?[public]interface接口名{//接口成员}普通方法和抽象方法的区别普通方法必须要有方法体,抽象方法不能有方法体(大括号也没有);抽象方法只能存在于抽象类/接口中,用abstract修饰,访问修饰符不能用private。抽象类和普通类有什么区别?抽象类要用abstract修饰;普通类可以实例化,抽象类不能实例化;抽象类体现的的是一种模板模式的设计。提问第3页/共26页本章任务模拟实现“愤怒的小鸟”游戏第4页/共26页抽象类的定义和使用理解接口概念理解面向对象设计原则理解抽象类和接口的优势本章目标接口的定义和使用点重理解抽象类概念点难点重第5页/共26页讲解:为什么使用抽象方法和抽象类交通工具公交车类方法:行驶(公路驾驶)地铁类方法:行驶(地下轨道)自行车类方法:行驶(人力蹬)实现父类行驶方法有意义吗?每个子类有自己独特的行驶方法交通工具类(抽象类)交通工具类方法:行驶抽象方法:行驶第6页/共26页问题:3种交通工具,都有自己的行驶方法,如何设计类结构?串讲:对比普通方法和抽象方法对比普通方法与抽象方法publicvoidshow(){System.out.println(hello);}publicabstractvoidshow();区别普通方法必须要有方法体(至少包含一对大括号),抽象方法不能有方法体(大括号也没有)抽象方法要用abstract修饰,访问修饰符不能用private抽象方法只能存在于抽象类/接口中第7页/共26页抽象方法定义非private访问修饰符abstract返回值类型方法名(参数列表);串讲:对比普通类和抽象类对比普通类与抽象类publicclassPerson{}Personp=newPerson();publicabstractclassPerson{}Personp=newPerson();区别抽象类要用abstract修饰普通类可以实例化,抽象类不能实例化(即不能使用new创建对象)抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。简单的说,抽象类是一个不能实例化的类,它可以具有抽象方法或者普通方法,也可以有构造方法。第8页/共26页代码有没有问题?串讲:抽象类的应用需求描述模拟“愤怒的小鸟”游戏中各种鸟的行为问题抽象类鸟飞行:弹射-飞叫:嗷---!(抽象方法)攻击分裂鸟攻击:分裂攻击火箭鸟攻击:加速冲撞分析使用抽象类定义鸟类飞行和叫为抽象类的普通方法攻击为抽象类的抽象方法在子类中实现攻击方法演示示例1:抽象类的应用第9页/共26页上机练习需求说明实现某公司各种岗位(经理、销售人员、普通员工)的员工薪水计算。经理的薪水为基本工资+奖金,销售人员的薪水为基本工资+销售量*每件提成,普通员工只有基本工资;要求输出不同岗位各一名员工的工资,使用抽象类实现;分析定义员工抽象类,具有姓名、基本工资的属性和计算薪水的抽象方法定义子类:经理类、销售人员类、普通员工类,分别继承员工抽象类,定义各自的属性,重写计算薪水的方法定义测试类,包含输出员工薪水的静态方法,参数为员工对象(抽象父类的引用指向子类的对象,可以实现多态)完成时间:20分钟共性问题集中讲解练习1第10页/共26页串讲:抽象类的优势抽象类可以将已经实现的方法提供给其子类使用,使代码可以被复用抽象类中的抽象方法在子类中重写,保证了子类还具有自身的独特性例如:鸟的飞行和叫的方法,不需在子类重复实现例如:每个鸟都有自己独特的攻击行为通过抽象类指向其子类的对象,可以实现多态第11页/共26页串讲:抽象类的体现-模板模式Template编写一个抽象父类,该父类提供了多个子类的通用方法,并把一个或多个抽象方法留给子类去实现,这就是模板设计模式抽象类是多个具体子类抽象出来的父类,具有高层次的抽象性;以抽象类作为子类的模板可以避免子类设计的随意性;抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展,但总体上大致保留抽象父类的行为方式;模板模式应用的简单规则:抽象父类可以只定义需要使用的某些方法,其余留给子类去实现;父类提供的方法只是定义了一个通用算法,其具体实现必须依赖子类的辅助;判断对错抽象类中只能定义抽象方法。抽象类中不能定义构造方法。抽象方法可以同时是静态方法。抽象类中可以没有抽象方法。声明抽象类和抽象方法都使用abstract关键字。抽象类不能实例化。抽象类中可以有静态方法。小结提问第13页/共26页串讲:理解接口USB接口其实并不是我们所看到的这些USB插槽,而是这些插槽所遵循的标准规范;我们所看到的插槽只是根据USB规范设计出来的实例而已;对于不同类型的USB设备而言,他们各自的USB插口都需要遵循同一个规范,遵守这个规范就可以保证插入USB插槽的设备能与主板正常通信;对于同一块主板上的多个USB插槽,它们有相同的数据交换方式,相同的实现细节,可看作是同一个类的不同实例;第14页/共26页生活中的接口是指某些企业和组织等制定的一种约定或标准比如USB接口串讲:理解接口抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就需要用到一种特殊的“抽象类”→接口;Java中的接口提供的也是一种规范,它规定了一个类必须做什么,而不关心这个类到底怎么做。publicinterface接口名extends父接口1,父接口2{//抽象方法}语法public类名implements接口{//实现接口定义的方法//普通方法}演示示例2:使用接口描述USB注意第15页/共26页接口没有构造方法,不能实例化;接口只能继承接口,不能继承类;接口里没有普通方法,都是抽象方法,默认修饰符是publicabstract;接口里的字段都是全局常量,默认修饰符是publicstaticfinal;一个类如果要实现一个接口,则必须实现该接口定义中的所有方法,否则该类只能定义为抽象类通常在接口名前加上字母I,用于区分类和接口同时用static和final修饰的域(即编译器常量)使用大写字母表示,每个单词用下划线隔开串讲:final关键字根据上下文环境,final关键字存在着细微的区别,但通常指的是“这是无法改变的”。final可以修饰类,方法,变量。final修饰的类不可以被继承。final修饰的方法不可以被重写。final修饰的变量是一个常量。只能被赋值一次。对基本类型,使用fianl,不能改变的是它的数值;对引用类型,使用fianl,不能改变的是它的引用,而对象本身是可以修改的。一旦一个final引用被初始化指向一个对象,这个引用将不能在指向其他对象;对于staticfinal修饰的全局常量,必须在声明的同时赋初值;串讲:对比抽象类和接口对比抽象类与接口publicabstractclassPerson{//抽象方法//普通方法}publicinterfacePerson{//抽象方法}区别抽象类使用abstract声明,接口使用interface声明抽象类可以包含属性、抽象方法(必须使用abstract关键字)、普通方法和构造方法,也可以不含抽象方法接口只能包含抽象方法(无须使用abstract关键字)和常量接口和抽象类一样,不能实例化抽象类与接口有什么区别?提问第17页/共26页讲解:认识抽象类的局限性实现“愤怒的小鸟”游戏中鸟叫的行为抽象类鸟飞行:弹射-飞叫:嗷---!攻击(抽象方法)分裂鸟攻击:分裂攻击火箭鸟攻击:加速冲撞红色鸟攻击:普通攻击叫:喳喳炸弹鸟攻击:爆炸攻击叫:喳喳胖子鸟攻击:扔蛋攻击叫:不叫代码冗余,复用度差第18页/共26页讲解:使用接口优化程序设计将鸟叫的行为定义为接口实现鸟叫接口输出各种具体的鸟叫声将鸟叫行为作为抽象鸟类的一个属性能不能用接口来实现鸟叫的行为,从而既避免代码冗余,又不影响扩展性?问题分析演示示例3:使用接口优化程序设计第19页/共26页接口规定了实现类里必须提供的方法,体现了规范和实现的分离,增强了系统的扩展性和可维护性;上机练习需求说明电视、风扇、冰箱等各种电器要想工作必须提供电源,使用接口模拟电器获得电源后进行工作分析定义电源的接口,具有供电的方法定义类:电视、风扇和冰箱类,分别实现电源接口定义测试类,包含电器开始工作的方法,参数为电器对象(接口的引用指向实现类的对象,可以实现多态)完成时间:20分钟共性问题集中讲解练习2第20页/共26页/*手机工厂*/classPhoneFactory{publicstaticICellPhonegetInstance(Stringtype){ICellPhonep=null;if(samsung.equalsIgnoreCase(type)){p=newSAMSUNG();}elseif(iphone.equalsIgnoreCase(type)){p=newIPhone();}returnp;}publicstaticvoidmain(String[]args){//ICellPhonep=newSAMSUNG();ICellPhonep=PhoneFactory.getInstance(samsung);p.sendMsg();}}串讲:简单工厂模式SimpleFactory//手机标准interfaceICellPhone{voidsendMsg();}/*三星手机*/classSAMSUNGimplementsICellPhone{publicvoidsendMsg(){}}/*IPhone手机*/classIPhoneimplementsICellPhone{publicvoidsendMsg(){}}屏蔽不同子类实现的差异,提高代码的可扩展性和可维护性串讲:实现多个接口一个类只能继承一个父类,但能同时实现多个接口。class类名extends父类名implements接口1,接口2,……{//类的成员}语法一个类可以同时继承类和实现接口,但是extends必须位于implements之前一个类实现多个接口,必须实现每个接口中的方法,否则只能定义为抽象类第22页/共26页接口可以继承接口吗?如果可以,能继承多个吗?接口可以实现接口吗?接口可以继承一个或多个接口;接口不能实现接口。提问串讲:实现多个接口示例某人既是软件工程师,又是慈善家,该如何实现?分析定义人类作为抽象父类,包含人的基本属性和行为定义编程接口,拥有编程能力定义慈善接口,拥有做慈善能力定义一个子类,继承人类,同时实现编程接口和慈善接口演示示例4:实现多个接口第23页/共26页上机练习需求说明在职研究生既要学习,还要工作,使用实现多个接口的方式定义研究生类分析定义人类作为抽象父类,包含人的基本属性和行为定义学习接口,拥有学习能力定义工作接口,拥有工作能力定义研究生类,继承人类,同时实现学习接口和工作接口完成时间:20分钟共性问题集中讲解练习3第24页/共26页小结:接口第25页/共26页Java中的接口提供了一种规范,规定一个类必须做什么,使得所有实现该接口的类在形式上都能保持一致;接口里的成员包括(主要是前两个):全局常量公共的抽象方法内部类(包括内部类,内部接口,内部枚举类);接口不能创建实例,但是可以用来声明引用类型变量。此时,引用类型的变量必须指向其实现类的对象。例:IStudents=newStudentImpl();小结:接口和抽象类相同点:都位于继承的顶端,用于被其他类实现或继承;自身不能实例化,都是依靠对象多态性,通过实现类/子类进行对象实例化;都可以包含抽象方法,其实现类/子类都必须重写这些抽象方法;区别:抽象类中可以含有成员变量,接口中只有全局常量;抽象类可以含有构造方法,可以为部分方法提供实现,避免子类重复实现这些方