资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第五篇 接口与多态,主要内容,接口,接口回调,面向接口编程,难点,面向接口编程,5.1,接口,从语言的角度看,,Java,的接口是该语言的又一特色。,Java,不支持多继承性,即一个类只能有一个父类。单继承性使得,Java,简单,易于管理和维护。,Java,的接口更加符合人的思维方式,5.1.1,接口的声明与使用,使用关键字,interface,来定义一个接口。接口的定义和类的定义很相似,分为接口的,声明,和,接口体,。,1,),接口声明,接口通过使用关键字,interface,来声明,格式:,interface,接口的名字,2,)接口体,接口体中包含,常量的声明(没有变量),和,方法定义,两部分。,接口体中,只有抽象方法,没有普通的方法;,接口体中,所有的常量的访问权限一定都是,public,(允许省略,public,、,final,修饰符);,所有的抽象方法的访问权限一定都是,public,(允许省略,public,、,abstract,修饰符),3,),接口的使用,在,Java,语言中,接口由类去实现以便使用接口中的方法。实现接口的类一定重写接口的方法。,一个类可以实现多个接口,类通过使用关键字,implements,声明自己实现一个或多个接口。,如果实现多个接口,则用逗号隔开接口名,类重写的接口方法以及接口中的常量可以被类的对象直接调用,而且常量也可以用类名或接口名直接调用;,public,接口可以被任何类实现,友好接口类可以被同一包中的类实现,接口也可以继承,如果类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是,abstract,类,5.1.2,理解接口,接口只关心操作,并不关心操作的具体实现,不同的类可以实现相同的接口,同一个类也可以实现多个接口,当一个类不希望通过继承使得自己具有某个方法时,可以考虑去实现接口,5.1.3,接口的,UML,图,5.2,接口回调,接口回调是借用了,C,语言中指针回调的术语,表示一个变量的地址在某个时刻存放在一个指针变量中,那么指针变量就可以操作该变量中存放的数据,在,Java,中,指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法。,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法,5.2.1,接口变量与回调机制,接口变量属于引用型变量,可以存放实现该接口的类的实例的引用。,Com,com,;,ImpleCom,object=new,ImpleCom,();,5.2.1,接口变量与回调机制,com=object;,接口回调非常类似于上转型对象调用子类的重写方法。,接口无法调用类中的其他非接口方法。,interface,ShowMessage,void,显示商标,(String s);,class TV implements,ShowMessage,public void,显示商标,(String s),System.out.println,(s);,class PC implements,ShowMessage,public void,显示商标(,String s,),System.out.println,(s);.,public class Example6_3 ,public static void main(String,args,),ShowMessage,sm,;/,声明接口变量,sm,=new TV();/,接口变量中存放对象的引用,sm,显示商标(,”,长城牌电视机,”,),;/,接口回调,sm,=new PC();/,接口变量中存放对象的引用,sm.,显示商标(,”,联想奔月,5008PC,机,”,),;/,接口回调,5.2.2,接口,的多态性,由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。,5.2.3 abstract,类与接口的比较,(1)abstract,类和接口都可以有,abstract,方法。,(2),接口中只可以有常量,不能有变量;而,abstract,类中既可以有常量也可以有变量。,(3)abstract,类中也可以有非,abstract,方法,接口不可以。,如果某个问题需要使用继承才能更好的解决,例如,子类除了需要重写父类的,abstract,方法,还需要从父类继承一些变量或继承一些重要的非,abstact,方法,就可以考虑用,abstract,类。,如果某个问题不需要继承,只是需要若干个类给出某些重要的,abstract,方法的实现细节,就可以考虑使用接口。,5.3,面向接口编程,面向抽象编程:抽象类,面向接口编程:接口类,抽象类将其抽象方法的实现交给其子类,而接口将其抽象方法的实现交给实现该接口的类。,使用接口进行程序设计的核心思想:使用接口回调,即接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。,利用接口也可以体现程序设计的“开闭”原则,即对扩展开放,对修改关闭。,设计一个广告牌,希望所设计的广告牌可以展示许多公司的广告词,问题的分析,如果我们设计的创建广告牌类中用某个具体公司类,如果每当用户有新的需求,就会导致修改类的某部分代码,那么就应当将这部分代码从该类中分割出去,使它和类中其他稳定的代码之间是松耦合关系(否则系统缺乏弹性、难以维护),即将每种可能的变化对应地交给实现接口的类(或抽象类的子类,见,5.10,节)去负责完成。,设计接口,首先设计一个接口,Avertisemen,,该接口有,2,个方法:,showAdvertisement,(),和,getCorpName,(),,那么实现,Avertisement,接口的类必须重写,showAdvertisement,(),和,getCorpName,(),。,设计一个广告牌,希望所设计的广告牌可以展示许多公司的广告词,设计广告牌类,设计,AdvertisementBoard,类(广告牌),该类有一个,show(Advertisement,adver,),方法,该方法的参数,adver,是,Avertisement,接口类型(就像人们常说的,广告牌对外留有接口)。,显然,该参数,adver,可以存放任何实现,Avertisement,接口的类的对象的引用,并回调类重写的接口方法,showAdvertisement,(),来显示公司的广告词,回调类重写的接口方法,getCorpName,(),来显示公司的名称。,
展开阅读全文