ch06-03面向对象编程-面向接口.ppt

上传人:本田雅阁 文档编号:3478576 上传时间:2019-09-01 格式:PPT 页数:48 大小:1.54MB
返回 下载 相关 举报
ch06-03面向对象编程-面向接口.ppt_第1页
第1页 / 共48页
ch06-03面向对象编程-面向接口.ppt_第2页
第2页 / 共48页
ch06-03面向对象编程-面向接口.ppt_第3页
第3页 / 共48页
ch06-03面向对象编程-面向接口.ppt_第4页
第4页 / 共48页
ch06-03面向对象编程-面向接口.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《ch06-03面向对象编程-面向接口.ppt》由会员分享,可在线阅读,更多相关《ch06-03面向对象编程-面向接口.ppt(48页珍藏版)》请在三一文库上搜索。

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

2、个实例,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接口,相当于主板上的PCI插槽的规范,class NetworkCard implements PCI public void start() System.out.println(

3、“Send.“); public void stop() System.out.println(“Network stop!“); ,声卡、网卡都实现了PCI插槽的规范,但行为完全不同,,一个实例,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

4、,,生活中的接口,USB接口,使用USB接口必须符合USB规范,接口是一套规范,遵守这个规范就可以实现功能,,接口的特点,JAVA中一个类能否继承多个父类?,接口: 接口可以说是对继承单根性的扩展 接口提供了一组规范、一个标准 接口屏蔽了实现的细节 方便多人协同开发 特点: 接口不能被实例化 不管是否标识,接口中所有方法都是抽象的,公共的。 接口中只能定义常量,,用接口实现,让我们为青蛙找一个合法的身份?,,JAVA接口,开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下: 教员、以及中心都具有方法:输出详细信息 中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息

5、系统要具备良好的可扩展性与可维护性,打印,教员,中心,教员 详细信息,中心 详细信息,detail方法 (输出详细信息),,JAVA接口,以下这个解决方案中存在着什么问题?,public class UCSTeacher1 /输出教员的详细信息 public String detail() return “本人是CSU教员“; ,public class UCSSchool1 private Printer printer = new Printer(); /输出中心的详细信息 public String detail() return “这里是CSU中心“; /使用打印机打印教员信息 pub

6、lic void print(UCSTeacher1 t) printer.print(t.detail(); /使用打印机打印中心信息 public void print(UCSSchool1 s) printer.print(s.detail(); ,public class Printer public void print(String content) System.out.println(“开始打印:“); System.out.println(content); ,每增加一种新类型,都需要增加相应的print(类型名称 var)方法 程序的可扩展性及可维护性极差 这不符合系统的要

7、求,,用Java接口重构项目,在这个系统中,存在继承关系吗? 教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类 教员、中心都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现这完全符合Java接口的定义,,类图,定义一个Java接口,在其中定义detail方法,但没有具体实现,实现这个Java接口,不同的类对detail方法有不同的具体实现,,使用了Java接口之后,这个系统有了怎样的改进?,Java接口重构之后,public interface IPrintable public String detail(); ,public class UC

8、SSchool2 implements Introduceable private Printer printer = new Printer(); /输出中心的详细信息 public String detail() return “这里是中信培训中心“; /使用中心打印机打印信息 public void print(IPrintable intro) printer.print(intro.detail(); ,public class UCSTeacher2 implements IPrintable /输出教员的详细信息 public String detail() return “本人

9、是中信教员“; ,通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性,使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了,,接口作为参数,接口描述了一个对象的特征 传递接口就是传递了实现接口的对象,public class SxtSchool2 /使用中心打印机打印信息 public void print(Introduceable intro) printer.print(intro.detail(); ,,什么是面向接口编程,开发系统时,主体构架使用接口,接口构成系统的骨架 这样就

10、可以通过更换接口的实现类来更换系统的实现,public class UCSSchool2 implements Introduceable private Printer printer = new Printer(); public String detail() return “这里是中信培训中心“; /使用中心打印机打印信息 public void print(Introduceable intro) printer.print(intro.detail(); ,,面向接口编程第一步,能否在前面的安例上添加黑白或彩色打印功能 采用面向接口编程的方式实现, 以下是三个步骤中的第一步:,抽象

11、出Java接口 1、分析: 黑白、彩色打印机都存在一个共同的方法特征:print 黑白、彩色打印机对print方法有各自不同的实现,public interface PrinterFace public void print(String content); ,,面向接口编程第二步,采用面向接口编程的方式实现,以下是三个步骤中的第二步: 实现Java接口: 结论:黑白、彩色打印机都实现PrinterFace接口,各自实现print方法,public class ColorPrinter implements PrinterFace public void print(String conten

12、t) System.out.println(“彩色打印:“); System.out.println(content); ,public class BlackPrinter implements PrinterFace public void print(String content) System.out.println(“黑白打印:“); System.out.println(content); ,,面向接口编程第三步,采用面向接口编程的方式实现,以下是三个步骤中的第三步:,使用 3、具体实现:,public class MySchool3 implements Introduceabl

13、e private PrinterFace printer; /打印机 public void setPrinter(PrinterFace p) this.printer = p; public String detail() return “这里是中“; public void print(Introduceable intro) printer.print(intro.detail(); ,public class Test public static void main(String args) / 创建中心实例 AccpSchool3 school=new AccpSchool3()

14、; /为该中心配备黑白打印机 school.setPrinter(new BlackPrinter(); school.print(school); /为该中心配备彩色打印机 school.setPrinter(new ColorPrinter(); school.print(school); ,,现场编程收作业的问题,如老师和学员都可以收作业, 那么收作业的方法应该放在哪个类?,A:Teacher类,B:Student类,C:两个都放,D:Person类,E:重新定义,造成代码冗余,如果增加一个工程师类,他不会收作业,如果继承这个类,Person类怎么办?,调用收作业的方法不需要改变,自定义

15、一个接口来实现IHomeworkCollector,,现场编程,,收作业的问题,public interface IHomeworkCollector void CollectHomework(); ,public class Student extends Person implements IHomeworkCollector,public void CollectHomework() MessageBox.Show(“报告老师!作业收集完毕!“); ,1、定义一个收作业的接口,2、在有收作业功能的类实现该接口,3、不同的类收作业方式不同,,作为返回值和参数的意义,接口作为参数 传递了实现

16、接口的对象 接口作为返回值 返回一个实现了接口的对象,,接口和抽象类比较,,小结,public interface Introduceable public String detail(); public void introduction() detail(); private void showMessage(); void speak(); ,Java接口中的方法必须是public,Java接口中不能有方法体实现,编译器会自动加上public修饰符,请指出下列Java代码中的错误。,,为什么需要常量,生活中,一周有七天,如何用代码表示?,public class Week private

17、 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天,控制台输出,如

18、何保证变量的值在运行期无法被改变?使用常量,,什么是常量,常量是一种标识符,它的值在运行期间恒定不变 常量标识符在程序中只能被引用,而不能被重新赋值,,关键字final,许多编程语言都提供了某种方法,来向编译器告知一个数据是恒定不变的。比如: 一个永不改变的“编译时常量” 一个在运行时被初始化的值,而你不希望它被改变。 在java语言中使用final关键字达到此目标 final变量 基本数据类型使用final:数值恒定不变 引用数据类型使用final:引用恒定不变 final方法:方法不被覆盖 final类:类不被继承,,关键字static,final可以定义常量吗? 回顾static的用法?

19、 关键字static告诉编译器,只分配一次内存空间。 静态的只能访问静态的,非静态的可以访问一切。 不能在静态方法中使用this关键字。,,常量的优点,如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?,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 f

20、inal 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; ,程序的可读性变差:用户很难理解数字或字符串的意思,程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错,使用常量可以增强程序的可读性、可维护性,,Java中常量的定义规则,加入final 关键字代表常量, 加入st

21、atic 关键字代表类变量 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串,public class AccpStudent public static final int FEMALE = 1; /代表女性 public static final int MALE = 2; /代表男性 private int sex; /性别 public void setSex(int sex) if(sex=FEMALE) System.out.println(“这是一名女学生“); else if(sex = MALE) System.out.println(“这是一名男学生“);

22、this.sex = sex; ,,在Java接口中声明常量,在Java 接口中声明的变量在编译时会自动加上static final的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点,public interface AccpSchoolType public static final String SCHOOL = “软件培训中心“; public static final String CITY = “长沙林科大“; ,public interface AccpSchoolType String SCHOOL = “软件培训中心“; String CITY = “长沙林科大“

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

24、。 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。,,内部类特性,内部类可以声明为抽象类 ,因此可以被其它的内部类继承。也可以声明为final的。 内部类可以声明为private或protected。 内部类可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量; 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。,,内部类( Inner class )的种类,实例内部类:和普通类一样,只是定义在另一个类中。 静态内部类:加有关键字static的内部类。 局部内部类:定义在一个方

25、法中的内部类。 匿名内部类:没有具体类名的内部类。,,内部类的例子,public class Outer1 private int size; /* 定义一个内部类,名为 “Inner“ */ public class Inner public void doStuff() / 内部类可以访问外部类的私有属性 size+; public void testTheInner() Inner i = new Inner(); i.doStuff(); ,,实例化内部类,实例化内部类的两种方法: 法一: Outer.Inner in=new Outer().new Inner(); 法二: Oute

26、r o=new Outer(); Outer.Inner I=new o.new Inner(); 如果内部类是static的,也可以用下面方法: Outer.Inner in=new Outer.Inner();,,内部类,类的名字只能在定义的范围内使用,除非使用有效的全名 内部类也可以定义在方法的内部。方法中final类型的局部变量,都可以被Inner类的方法访问。,,修饰符适用范围,,OOP的三大特性总结,,什么是设计模式,模式就是得到很好研究的范例 设计模式是软件开发过程中经验的积累 特定问题的经过实践检验的特定解决方法,走为上,围魏救赵,声东击西,,单例模式Singleton,单例模式 结果:类的实例永远只有一个 做法: 将类的构造函数设置成private外部不能使用。 在类的内部定义一个静态的本类型的成员变量保存创建的对象 提供一个静态的方法给外部使用(返回对象)。 对象的hashcode 人的身份证号码 hashcode就是对象的身份标识 对象的唯一标识,,简单工厂模式,简单工厂设计模式,,简单工厂案例,用简单工厂方式重构前面收作业程序。 模拟一汽汽车公司为客户生产汽车。,,总结,向接口编写程序代码带来什么样的好处? 接口与抽象类的区别? Final和static关键字的的特点? 什么是设计模式?单例设计模式用在什么场合,简单工厂模式用在什么场合?,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1