抽象类和接口

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