资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,抽象类和接口,第 四 章,Java,中的抽象类、接口和程序包,抽象类与抽象方法,抽象类,:用,abstract,关键字来修饰一个类时,该类叫做抽象类;,抽象类必须被继承。,抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(,final,类)正好相反。,抽象方法,:用,abstract,来修饰一个方法时,该方法叫做抽象方法。,抽象方法必须被重写,抽象方法只有声明,不能有实现。,定义了抽象方法的类必须是抽象类。,abstract,returnType,abstractMethod,(,paramlist,);,抽象类与抽象方法,抽象类和最终类,声明抽象类与抽象方法,public abstract class PlaneGraphics1/,平面图形类,抽象类,public abstract double area();/,计算面积,抽象方法,分号“,;”,必不可少,抽象类和最终类,规定:,抽象类不能被直接实例化,只有它的非抽象子类可以创建对象,抽象类中不一定包含抽象方法,但有抽象方法的类必定是抽象类,抽象类中的抽象方法只是声明,不包含方法体,即不给出方法的实现,构造方法、类方法不能声明为抽象方法,抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类,抽象类和最终类,抽象类的意义:,描述抽象的概念,规定必须实现的方法的统一接口,关于抽象类和抽象方法,Abstracttest.java,最终类和最终方法,final,关键字修饰的类称为最终类,最终类不能被继承,final,关键字修饰的方法称为最终方法,最终方法不能被覆盖,最终方法和最终类没有必然的对应关系,Java,中的接口,1,、含义:一组只有成员函数原型定义而无成员函数定义体的方法集。接口定义了一组成员函数,但没有具体加以实现,其实现则是由实现该接口的类来加以具体完成的。,2,、作用:,为若干个类(相关或无关的类)定义一组相同的功能行为,从而达到相同的功能名称,不同的功能实现之目的;,另外也可以实现类似,C+,语言中的多重继承但又避免了虚基类的编程。,接口的概念,在构建问题的类过程中,我们经常会遇到一种特殊的情况,在描述某个类的各个方法时,对每个方法我们只能给出其功能实现的要求(原形声明)但不能给出具体的功能实现(函数定义体)。因为我们所处理的问题只是一个,泛泛的功能说明,,并没有针对某一具体类型的问题来说明。,接口定义格式,要点:类似于类的定义格式,只是以,interface,作为定义符。,格式:,接口的类型,interface,接口名,常量(并且必须初始化);,成员方法定义(只有原形而无函数定义体);,或:,接口的类型,interface,派生的接口名,extends,父接口名列表,接口中的成员变量定义;,接口中的成员方法原型定义;,实现接口,方法:,通过定义一个类同时采用,implements,来指明所实现的接口名,并在该类中重写接口中的,所有成员方法,且给出成员函数体定义。,要点,类中所实现的接口中的成员函数的原型都应该与它在 接口中的原型定义保持一致;,并在类中重写接口中的,所有,成员方法;,通过实现接口,从而可扩充或增加该类的功能。,接,口只定义方法名,而类实现,接,口内部的方法的代码,接,口的继承只是继承接口本身,而非代码,从而不会产生重复继承多次。,注意的,一个类可以实现多个接口,实现接口的类必须给出接口中所有方法的具体实现!除非这个类是抽象类,接口的作用,接口提供了完全的抽象,说明所有实现该接口的类应具有的形式,接口中的方法在多个实现接口的类中表现出多态性,接口回调,接口也是引用数据类型,指向接口的引用也可以指向任意实现了该接口的类创建的实例,接口回调,即接口的引用可以指向实现了接口的类的实例,例子:,Interfacetest.java,例子,interface Computer,public void,ComputeData,();/,计算机应该有数据计算的功能,public void,SaveData,();/,计算机应该有存储数据的功能,public void,PrintData,();/,计算机应该有打印数据的功能,public void,DisplayData,();/,计算机应该有显示数据的功能,抽象类和接口的对比,接口和类是很相似但又有区别的一种数据结构,其设计和调用也是,JAVA,程序设计的一种重要技术。,从结构上看,接口有如下特点:,接口用,interface,来定义,而不是,class,接口中定义的变量去全部是最终的静态变量,接口中没有自身的构造方法,不能创建实例,而定义的,其他方法全是抽象方法,即提供了方法的定义,但是没有提供方法的实现。,接口采用多重继承机制,而不是采用单一的继承机制。,接口与抽象类的区别,抽象类和接口中主要关心的都是抽象,而不关心具体的实现。但也有一些区别:,一个类只能继承一个类,但可以实现多个接口,抽象类表示一种继承关系,接口只说明功能,二者的区别主要体现在对问题域的理解上,抽象类的应用,abstract class Person,private,int,ID;,private String Name;,public abstract void,Eat(Food,obj,);,public void,Step(Feet,obj,),public void Sleep(),在描述某一个问题时,如果只能给出部分的功能实现,而不能给出全部的功能实现时,应该采用抽象类来描述。,接口,的应用,interface TV,public,int,Size=29;,public abstract void,showImage,();,public abstract void,setChannel,();,public abstract void,receiveImage,();,在描述某一个问题时,如果不能给出任何的功能实现,应该采用接口来描述。,内部类,声明内部类,在一个类中包含另一个类的定义,内部类可以在类、方法甚至语句块中定义,内部类可以是,private,或,protected,的,内部类,内部类作用,与接口一起实现完整的多重继承,内部类作用,InnerClass.java,内部类具有访问外部类的引用,/,内部类引用外部类的成员,public class Inner2,class,aa,int,a=1;,class bb,int,b=2;,class cc,/,这对括号必须有,因为类中语句必须包含在一个代码块或方法体中,int,b=4;,int,c=3;,System.out.println(cc,);,System.out.println(cc.c,=+c);,System.out.println(bb.b,=+,bb.this.b,);/,内部类引用外部类成员,System.out.println(aa.a,=+,aa.this.a,);,内部类,匿名内部类,当只需创建一个类的对象而用不上它的名字时,可以使用匿名内部类,匿名内部类由于没有名字,所以它没有带名字的构造函数,java,的匿名,内部类的,语法规则看上去有些古怪,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:,new,interfacename,().;,或,new,superclassname,().;,有一点需要注意的是,匿名内部类由于没有名字,所以它没有带名字的构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用,super,关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:,如果是在一个方法内部的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为,final,。,将匿名内部类改造成有名字的局部内部类,这样它就可以拥有有名字的构造函数了。,在这个匿名内部类中使用初始化代码块。,匿名内部类实例,class,PackBox,interface Goods/,定义内部接口,String,getName,();,Goods,SportShoe,(),return new Goods(),/,匿名内部类,String name=,运动鞋,;,int,price=200;,public String,getName()return,name;,;,/,事实上匿名内部类必须继承一个类或实现一个接口,
展开阅读全文