《面向对象的Java实现-接口.ppt》由会员分享,可在线阅读,更多相关《面向对象的Java实现-接口.ppt(42页珍藏版)》请在三一办公上搜索。
1、面向对象的Java实现-接口,第八章,2,回顾,举例说明在什么样的情况下,需要使用到继承?在Java程序中,多态性带给我们的好处是什么?,3,预习检查,什么是常量?Java中,常量的定义规则有哪些?什么是面向接口编程,它的好处是什么?,4,本章任务,升级HelloACCP,打印ACCP中心与教员的详细信息:正确使用面向接口编程的思想提高系统的可扩展性及可维护性,5,掌握Java接口理解Java接口与多态的关系掌握面向接口编程的思想掌握常量接口的使用,本章目标,抽象类,可以使用abstract来修饰一个类和方法用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个
2、方法是一个抽象方法。抽象类不能被实例化抽象方法是只有方法声明,而没有实现的方法。构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。,6,抽象类的例子,public abstract class Shape/*画出自己*/public abstract void draw();/*得到面积*/public double getArea()return 100.0;,7,抽象类(abstract class),抽象类里面并非一定需要抽象方法,但是没有抽象方法,抽象类就没有存在的必要在以下任一条件成立时,类必须定义成抽象类:类中有至少一个抽象方法类继承了父类中的抽象方法,但是至少有
3、一个抽象方法没有实现类实现了某个接口,但没有全部实现接口中的方法,8,创建抽象类的对象,抽象类不可实例化如果从一个抽象类继承,并想创建该新类的对象,那么我们就必须为基类中的所有抽象方法提供方法定义。如果不这样做(可以选择不做),那么抽象类的子类便也是抽象类,且编译器将会强制我们用abstract关键字来限制修饰这个类。创建抽象类的对象扩展抽象类,实现其所有抽象方法创建该抽象类子类的对象,9,抽象类的使用例子,public class Circle extends Shape public void draw()System.out.println(draw a circle.);TestSha
4、pe.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)的概念向前更迈进了一步。你可以将它看作是“纯粹的”抽象类。它允许类的创建者为一个类建立其形式:有方法名、参数列表和返回类型,但是没有任何方法体。接口也可以包含有数据成员。接口只提供了形式,而未提供任何具体实现。接口是
5、方法和常量值的定义的集合。,11,接口的定义,修饰符interface接口名extends父接口名表 修饰符域类型域名常量值;/常量域声明 修饰符返回值方法名(参数表);/抽象方法声明 因为所有定义在接口中的常量都默认为public、static和final。所有定义在接口中的方法默认为public和abstract,所以可以不用修饰符限定它们。和类不同的是,一个接口可以继承多个父接口.,12,接口例子,public interface IShape/面积 double area=100.0;/画出自己 void draw();/得到面积 double getArea();,13,实现接口,多
6、个无关的类可实现同一个接口。一个类可实现多个无关的接口语法如下: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.
7、getArea();,15,实现接口注意事项,在类的声明部分,用implements关键字声明将要实现那些接口;如果实现某接口的类不是abstract类,则在类的定义部分必须实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致;如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法。但其非abstract的子类中必须有所有抽象方法的实在的方法体;接口的抽象方法的访问控制符都已指定为public,因此,类在实现方法时,必须显式地使用public修饰符。否则,将缩小接口定义方法的访问控制范围。(报错),16,17,生活中的接口,电脑主板上的PCI插槽的规范就类似于J
8、ava接口,声卡,显卡,网卡,每种卡的内部结构都不相同,可以把声卡、网卡、显卡都插在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
9、!);,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
10、nc=new NetworkCard();PCI sc=new SoundCard();nc.start();sc.start();,可以使用Java接口标识类型运行时,根据实际创建的对象类型调用相应的方法实现,Du du.Send.,控制台输出,2,1,20,为什么需要Java接口 5-1,为ACCP各中心开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下:教员、以及中心都具有方法:输出详细信息中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息系统要具备良好的可扩展性与可维护性,打印,教员,中心,教员详细信息,中心详细信息,detail方法(输出详细信息),21,
11、为什么需要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();/使用打印机打印中
12、心信息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方法(负责输出详
13、细信息),教员详细信息,中心详细信息,1,2,2,1,回顾多态的含义:实现同一个接口,使用不同的实例而执行不同操作,23,为什么需要Java接口 5-4,在这个系统中,存在继承关系吗?教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类教员、中心都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现这完全符合Java接口的定义,定义一个Java接口,在其中定义detail方法,但没有具体实现,实现这个Java接口,不同的类对detail方法有不同的具体实现,24,为什么需要Java接口 5-5,public interface Introduceable
14、 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/输出教员的详细
15、信息public String detail()return 本人是ACCP教员;,通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性,使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了,使用了Java接口之后,这个系统有了怎样的改进?,25,小结 1,为刚才完成的系统增加一种新的类型:学员(AccpStudent),具体要求如下:学员具有detail方法,负责输出学员详细信息能够通过中心的打印机打印学员的详细信息系统要具备良好的可扩展性与可维护性编写测试类StudentTest进行测
16、试,要求:通过中心的打印机打印学员的详细信息,StudentTest完整代码实现,AccpStudent完整代码实现,26,什么是面向接口编程,开发系统时,主体构架使用接口,接口构成系统的骨架这样就可以通过更换接口的实现类来更换系统的实现,public class AccpSchool2 implements Introduceable private Printer printer=new Printer();public String detail()return 这里是ACCP中心;/使用中心打印机打印信息public void print(Introduceable intro)pri
17、nter.print(intro.detail();,Introduceable,AccpTeacher2(教员),AccpSchool2(中心),27,面向接口编程的示例 4-1,升级上述的ACCP系统,要求:打印机有多种类型,比如:黑白打印机、彩色打印机等中心可能配备其中任意一款打印机,负责打印教员、或者中心的详细信息系统要具备良好的可扩展性与可维护性,print方法(打印),彩色打印机,黑白打印机,黑白内容,中心/教员 详细信息,彩色内容,28,面向接口编程的示例 4-2,采用面向接口编程的方式实现,以下是三个步骤中的第一步:,抽象出Java接口1、分析:黑白、彩色打印机都存在一个共同的
18、方法特征:print黑白、彩色打印机对print方法有各自不同的实现2、结论:抽象出Java接口PrinterFace,在其中定义方法print3、具体实现:,public interface PrinterFace public void print(String content);,29,面向接口编程的示例 4-3,采用面向接口编程的方式实现,以下是三个步骤中的第二步:,public class ColorPrinter implements PrinterFace public void print(String content)System.out.println(彩色打印:);Sys
19、tem.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
20、-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
21、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代码
22、,然后请采用面向接口编程的思想,在空白处填写正确的代码,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()S
23、ystem.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插槽规范的卡
24、,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
25、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 a
26、ng)return ang/180.0*;public static double toDegrees(double ang)return ang*180.0/;,public static final double PI/圆周率public static double toRadians(double ang)return ang/180.0*PI;public static double toDegrees(double ang)return ang*180.0/PI;,程序的可读性变差:用户很难理解数字或字符串的意思,程序的可维护性变差:如果数值改变,则需要在很多地方改动,既麻烦又易出错
27、,使用常量可以增强程序的可读性、可维护性,36,Java中常量的定义规则,加入final 关键字代表常量,加入static 关键字代表类变量尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串,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(se
28、x=MALE)System.out.println(这是一名男学生);this.sex=sex;,37,在Java接口中声明常量,在Java 接口中声明的变量在编译时会自动加上static final的修饰符,即声明为常量,因而Java接口通常是存放常量的最佳地点,public interface AccpSchoolType public static final String ACCP=ACCP加盟中心;public static final String BENET=BENET直营中心;,public interface AccpSchoolType String ACCP=ACCP加盟
29、中心;String BENET=BENET直营中心;,等同于,38,小结 3,编写一个用于放置常量的Java接口Constants,具有常量MAX和MIN编写一个测试类ConstantsTest,在main方法中求取Constants中的两个常量之差,Constants完整代码实现,ConstantsTest完整代码实现,39,OO思想总结,40,总结,public interface Introduceable public String detail();public void introduction()detail();private void showMessage();void speak();,Java接口中的方法必须是public,Java接口中不能有方法体实现,编译器会自动加上public修饰符,请指出下列Java代码中的错误。,作业,有三角形,矩形,圆,椭圆,分别求出各自的周长,面积要求先使用abstract实现,再使用interface实现.,41,Question?,