1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,抽象类与接口,本章内容,1.,抽象类的概念、定义与应用,2.,接口的概念、定义与应用,介绍几种常见的设计模式,3.,抽象类与接口的比较,相同点,不同点,抽象类,包含有,至少一个,抽象方法的类称为抽象类,用,abstract,关键字修饰,,不能创建自己的对象,,抽象方法交由子类去覆盖,(,完成方法体,),。,抽象方法:,只有方法的头部,没有方法体,。在继承抽象类的子类中来,实现父类中的所有抽象方法,(,完成方法体部分,),。,声明抽象方法与抽象类,权限修饰符,abstract,returnType,方法名,(
2、paramlist,),;,说明,:(1),只有方法头部,没有方法体,以“;”结束。,(2),构造方法不能声明为抽象方法。,例如:,public abstract float,getArea,();,权限修饰符,abstract,class,类名称,成员属性,;,方法(),;,/,定义一般方法,构造方法,();,abstract,方法(),;,/,定义抽象方法,抽象类的作用,抽象类本身不能实例化,而抽象类的子类实现了抽象类的抽象方法,,因此通常都是定义抽象类的引用指向子类的实例,自动完成向上转型,,是对象多态性的一个很好体现。,AbstractClass,ac=new,AbstractCla
3、ssImp,();,抽象类应用举例,有三类图书:科技书、文艺书和教材。三类书的属性和方法如下图所示,请用抽象类的方式完成相关代码的编写。,(,图书价格,=,每页价格*页码*折扣,),文艺书类,页码,折扣,每页价格,显示种类,显示图书价格,科技书类,页码,折扣,每页价格,显示种类,显示图书价格,教材类,页码,折扣,每页价格,显示种类,显示图书价格,/,定义抽象类,Book,abstract,class Book,int,bookPage,;,float discount;,float,pagePrice,;,/,定义三个成员属性,public,Book(int,bookPage,float,di
4、scount,float,pagePrice,),this.bookPage,=,bookPage,;,this.discount,=discount;,this.pagePrice,=,pagePrice,;,abstract void,showKind,();/,显示图书种类,public float,getPrice,()return,bookPage,*discount*,pagePrice,;,class,ScienceBook,extends Book/,定义科技书,public,ScienceBook,(int,bookPage,float,discount,float,page
5、Price,),super(bookPage,discount,pagePrice,);,public void,showKind,()/,实现抽象方法,System.out.println(The,books type is,science,);,class,ArtBook,extends Book/,定义文艺书,public,ArtBook,(int,bookPage,float,discount,float,pagePrice,),super(bookPage,discount,pagePrice,);,public void,showKind,()/,实现抽象方法,System.out
6、println(The,books type is,art,);,public class,BookTest,public static void,main(String,args,),Book,sb,=new ScienceBook(520,0.7f,0.2f);,sb.showKind,();,System.out.println(getPrice,();,Book,tb,=new ArtBook(400,0.8f,0.3f);,tb.price,=tb.getPrice(400,0.8f);,tb.showKind,();,System.out.println(getPrice,();
7、抽象类的实际应用,如何在实际应用中定义抽象类,?,(1),提取子类共有的属性,(,可选项,),(2),提取子类共有的方法,(,可选项,),提取子类共有的方法,但该方法的方法体子类各有不同,则此方法定义为抽象方法。,(,必须项,),练习,:,学生有姓名、年龄和成绩属性;教师有姓名、年龄和职称属性;学生和教师都能讲话,但所讲的内容不同。采用抽象类的方式完成上述代码的编写。,接口的定义,现实世界的接口:,两个不同物体之间相互交互所必须通过的一个中介,没有这个中介,两者无法交互。,软件世界的接口:,(1),狭义:某个程序设计语言所提供的,API,。,(2),广义:人与软件交互的图形界面,(GUI),
8、Java,中的接口:,一种特殊的,“,类,”,,只能包含,常量,和,抽象方法,,属于引用数据类型。,接口的作用,为什么要定义接口:,Java,出于安全性考虑,,只支持单重继承,,而不支持多重继承。,多重继承更能表达现实世界。,接口的作用:,配合继承解决,Java,无法多继承的缺点,提供方法声明与实现相分离的机制,,使实现接口的各个类表现出多态性,。,A,a=new,B,();,(B,是实现了接口,A,的类,),接口的定义,一个接口的定义包含以下部分:,public,interface,MyInterface,extends,Interface1,public static final,do
9、uble E=2.718282;,public abstract,void,doSomething,(,int,i,double x);,public abstract,int,doSomethingElse(String,s);,访问控制符,接口关键字,接口名,接口可以继承接口,接口中可以定义常量,抽象方法,只声明不实现,接口的实现,接口的实现是交给类来完成的。,public class,MyInterface,Imp,extends,父类名,implements,接口名,继承了接口中的常量,public,void,doSomething,(,int,i,double x),public,i
10、nt,doSomethingElse(String,s),一个类可以实现多个接口,实现接口的抽象方法,添加方法体,接口的简单应用,定义一个测试类,分别创建圆形类和矩形类的对象,输出各自的面积和周长。,接口的高级应用,-,设计模式,设计模式针对面向对象系统中重复出现的设计问题,提出一个通用的设计方案,并予以系统化的命名和动机解释。,设计模式描述了问题、解决方案、在什么条件下使用该解决方案及其效果。,解决方案是解决该问题的,一组精心安排的通用的类和接口,,再经过定制和实现就可用来解决特定上下文中的问题。,代理模式,应用的场景,:一个对象不想或者不能直接引用另外一个对象,那么通过代理可以在两者之间起
11、到连接作用。,(1),抽象目标角色,:声明真实目标对象和代理的共同接口。,(2),代理角色:,内部包含对真实目标对象的引用。,(3),真实目标角色:,是客户端真正要交流的对象,需要被代理。,适配器模式,使用场景,:将一个类的接口,(,被适配对象,),转换成客户希望调用的另外一个接口,(,目标,),。,适配器模式,模式的三种角色:,目标,(Target):,客户想使用的接口。,被适配者,(Adaptee):,一个已经存在的接口或抽象类,需要被适配。,适配器,(Adapter):,是一个类,实现目标接口并包含被适配者的引用。,接口的特点,(1),接口可以定义为多继承。,类不能多继承。,interf
12、ace A,double getArea();,interface B,String getName();,public interface C,extends A,B,String getAddress();,(2),接口没有最高层,类有最高层,-,Object,接口的特点,(3),接口中的方法,默认为,public abstract,;接口中的成员属性,默认为,public static final,。,例如:,double PI=3.14f;,系统默认为,public static final double PI=3.14159;,(4),接口中的方法只能是抽象方法,,不存在非抽象方法和
13、构造方法。,抽象类与接口的比较,-,相同点,(1),都包含抽象方法,必须被子类实现。,(2),不能被实例化。,(3),都是引用数据类型。可以声明抽象类及接口变量,并将子类的对象赋给抽象类变量。,AbstractClass ac=new AbstractClassImp();,或将实现接口的类的对象赋给接口变量。,Interface interVar,new InterfaceImp();,抽象类与接口的比较,-,区别,比较点,抽象类,接口,定义,abstract class,interface,组成,变量、常量、构造方法、抽象方法、方法,全局常量、抽象方法,子类,子类通过,extends,继承,一个子类只能继承一个抽象类,子类通过,implements,实现,子类可以实现多个接口,关系,一个抽象类可以实现多个接口,接口不能继承抽象类但可以实现多个接口,实现限制,存在单继承局限,不存在此限制,典型设计模式,模板模式,代理模式、适配器模式,优先使用接口,接口没有单继承这个限制,






