本章学习目标1抽象类2接口3内部类4枚举类型3JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校抽象类(1)在定义Java方法时可以只给出方法头,而不必给出方法体、即方法实现的细节,这样的方法被称为抽象方法。抽象方法必须使用关键字abstract修饰,包含抽象方法的类必须声明为抽象类。publicabstractclassAnimal{privateintage;publicvoidsetAge(intage){this.age=age;}publicintgetAge(){returnage;}publicabstractvoideat();}4JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校抽象类(2)publicclassPersonextendsAnimal{privateStringname;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoideat(){//重写方法System.out.println(洗手→烹饪→摆餐具→吃喝→收摊儿---);}}publicclassBirdextendsAnimal{publicvoidfly(){//重写方法System.out.println(我心飞翔!);}publicvoideat(){System.out.println(直接吞食!);}}5JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校抽象类(3)Java语言规定,子类必须实现其父类中的所有抽象方法,否则该子类也只能声明为抽象类。抽象类不能被实例化。publicclassTest{publicstaticvoidmain(String[]args){Animala=newPerson();a.setAge(2);a.eat();}}6JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校抽象类(4)抽象类主要是通过继承、再由其子类发挥作用的,其作用包括两方面:¾代码重用¾规划其他特性:¾抽象类中可以不包含抽象方法;¾子类中可以不全部实现抽象父类中的抽象方法,但此时子类也只能声明为抽象类;¾父类不是抽象类,但在子类中可以添加抽象方法,但子类需声明为抽象类;¾抽象类中可以声明static属性和方法;7JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校参照前述例程,编写自己的抽象类和应用程序,测试并体会抽象类相关特性。8JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口(1)接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口举例:publicinterfaceRunner{publicstaticfinalintid=1;publicabstractvoidstart();publicabstractvoidrun();publicabstractvoidstop();}9JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口(2)接口中定义的属性必须是publicstaticfinal的,而接口中定义的方法则必须是publicabstract的,因此这些修饰符可以部分或全部省略:和继承关系类似,Java类可以“实现”接口,且接口和实现类之间也存在多态性。publicinterfaceRunner{publicstaticfinalintid=1;publicabstractvoidstart();publicabstractvoidrun();publicabstractvoidstop();}publicinterfaceRunner{intid=1;voidstart();voidrun();voidstop();}等价于[modifier]classname[extendssuperclass][implementsinterface[,interface]*]{declarations*}10JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口应用举例(1)publicclassPersonimplementsRunner{publicvoidstart(){System.out.println(弯腰、蹬腿、咬牙、瞪眼、开跑);}publicvoidrun(){System.out.println(摆动手臂、维持直线方向);}publicvoidstop(){System.out.println(减速直至停止、喝水);}}publicclassTest{publicstaticvoidmain(String[]args){Runnerr=newPerson();r.start();r.run();r.stop();}}11JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口应用举例(2)interfaceRunner+start()+run()+stop()Person+start()+run()+stop()+dance()Car+start()+run()+stop()+fillFuel()+crack()Bird+start()+run()+stop()+fly()12JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口的多重实现(1)interfaceRunner{publicvoidrun();}interfaceSwimmer{publicvoidswim();}abstractclassAnimal{publicabstractvoideat();}classPersonextendsAnimalimplementsRunner,Swimmer{publicvoidrun(){System.out.println(Iamrunning,tothesea!);}publicvoidswim(){System.out.println(Iamswimming,totheisland!);}publicvoideat(){System.out.println(Iameating!);}}13JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口的多重实现(2)publicclassTest{publicstaticvoidmain(Stringargs[]){Testt=newTest();Personp=newPerson();t.m1(p);t.m2(p);t.m3(p);}publicvoidm1(Runnerf){f.run();}publicvoidm2(Swimmers){s.swim();}publicvoidm3(Animala){a.eat();}}输出结果:Iamrunning,tothesea!Iamswimming,totheisland!Iameating!14JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校{publicvoidma();}interfaceB{publicintmb(inti);}interfaceCextendsA,B{publicStringmc();}classDimplementsC{publicvoidma(){System.out.println(Implementsmethodma()!);}publicintmb(inti){return2000+i;}publicStringmc(){returnHello!;}}15JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校接口特性总结通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系;接口可以被多重实现;接口可以继承其它的接口,并添加新的属性和抽象方法。接口间支持多重继承。16JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校定义自己的接口、实现类和测试程序,体会接口的功能和用法17JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校嵌套类Java语言支持类的嵌套定义,即允许将一个类定义在其他类的内部,其中内层的类被称为嵌套类(NestedClass)。嵌套类可以分为两种:¾静态嵌套类(StaticNestedClass):使用static修饰的嵌套类;¾内部类(InnerClass):非static的嵌套类。publicclassA{…privateclassB{//内部类…}publicstaticclassC{//静态嵌套类…}}18JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校内部类内部类又可分为三种情况:1.普通的内部类:在Java类中、方法或语句块的外部定义的非static类。2.局部内部类:也称局部类(LocalClass),定义在方法或语句块中的类。3.匿名内部类:也称匿名类(AnonymousClass),定义在方法或语句块中,该类没有名字、只能在其所在之处使用一次。Java嵌套类静态嵌套类内部类局部内部类匿名内部类普通内部类19JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校内部类内部类与其所在的外层类之间存在着逻辑上的依赖关系——内部类的对象不能单独存在,它必须依赖一个其外层类的对象;在内部类中可以直接访问其外层类中的成员、包括属性和方法,即使这些属性和方法是private的。内部类可以声明为抽象类,因此可以被其它的内部类继承。也可以声明为final的。和外层类不同,内部类可以声明为private或protected。20JavaSEJavaSE应用程序设计应用程序设计新科海学校新科海学校使用内部类(1)publicclassA{privateints;publicclassB{publicvoidmb(){s=100;//p3System.out.println(在内部类B中s=+s);}}publicvoidma(){Bi=newB();//p2i.mb();}}publicclassTestInner{publicstaticvoidmain(Stringargs[]){Ao=newA();//p1o.ma();}}21JavaSEJavaSE应用程序设计应