您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > JSE-08(高级类特性).
第8章高级类特性讲师:李贺飞本章内容第一节抽象类第二节接口第三节内部类第四节枚举第五节注解第一节抽象类抽象类(abstractclass)随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。抽象类用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。抽象方法:只有方法的声明,没有方法的实现。以分号结束:abstractintabstractMethod(inta);含有抽象方法的类必须被声明为抽象类。抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。抽象类举例abstractclassA{abstractvoidm1();publicvoidm2(){System.out.println(A类中定义的m2方法);}}classBextendsA{voidm1(){System.out.println(B类中定义的m1方法);}}publicclassTest{publicstaticvoidmain(Stringargs[]){Aa=newB();a.m1();a.m2();}}抽象类应用在航运公司系统中,Vehicle类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。问题:卡车(Truck)和驳船(RiverBarge)的燃料效率和行驶距离的计算方法完全不同。Vehicle类不能提供计算方法,但子类可以。解决方案Java允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。Vehicle是一个抽象类,有两个抽象方法。publicabstractclassVehicle{publicabstractdoublecalcFuelEfficiency();//计算燃料效率的抽象方法publicabstractdoublecalcTripDistance();//计算行驶距离的抽象方法}publicclassTruckextendsVehicle{publicdoublecalcFuelEfficiency(){//写出计算卡车的燃料效率的具体方法}publicdoublecalcTripDistance(){//写出计算卡车行驶距离的具体方法}}publicclassRiverBargeextendsVehicle{publicdoublecalcFuelEfficiency(){//写出计算驳船的燃料效率的具体方法}publicdoublecalcTripDistance(){//写出计算驳船行驶距离的具体方法}}抽象类应用注意:抽象类不能实例化newVihicle()是非法的思考问题1:为什么抽象类不可以使用final关键字声明?问题2:一个抽象类中可以定义构造器吗?1.将Frock类声明为抽象类,在类中声明抽象方法calcArea方法,用来计算衣服的布料面积。2.通过编写代码来验证抽象类中是否可包含属性、具体方法和构造器。3.编写Shirt类继承Frock类,实现calcArea方法,用来计算衬衣所需的布料面积(尺寸*1.3)。4.在TestShirt类的main方法中:1.试着创建Frock对象,确认是否允许?2.使用本态引用创建Shirt对象,并调用calcArea方法,打印计算结果。3.使用Frock多态引用创建Shirt对象,并调用calcArea方法,打印计算结果。练习作业编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary。提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问。模板方法设计模式(TemplateMethod)抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。解决的问题:当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。模板方法设计模式(TemplateMethod)abstractclassTemplate{publicfinalvoidgetTime(){longstart=System.currentTimeMillis();code();longend=System.currentTimeMillis();System.out.println(执行时间是:+(end-start));}publicabstractvoidcode();}classSubTemplateextendsTemplate{publicvoidcode(){for(inti=0;i10000;i++){System.out.println(i);}}}第二节接口接口(1)有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。实现接口类:classSubClassimplementsInterfaceA{}一个类可以实现多个接口,接口也可以继承其它接口。接口(2)运动员(抽象类)学生(抽象类)篮球运动员大学生跨栏运动员中学生学习英语的技能(接口)接口(3)接口的特点:用interface来定义。接口中的所有成员变量都默认是由publicstaticfinal修饰的。接口中的所有方法都默认是由publicabstract修饰的。接口没有构造器。接口采用多继承机制。接口定义举例publicinterfaceRunner{intID=1;voidstart();publicvoidrun();voidstop();}publicinterfaceRunner{publicstaticfinalintID=1;publicabstractvoidstart();publicabstractvoidrun();publicabstractvoidstop();}接口(4)实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。否则,仍为抽象类。接口的主要用途就是被实现类实现。(面向接口编程)与继承关系类似,接口与实现类之间存在多态性定义Java类的语法格式:先写extends,后写implementsmodifierclassname[extendssuperclass][implementsinterface[,interface]*]{declarations*}接口应用举例(1)interfaceRunner+start()+run()+stop()Person+start()+run()+stop()+dance()Car+start()+run()+stop()+fillFuel()+crack()Bird+start()+run()+stop()+fly()接口应用举例(1)publicinterfaceRunner{publicvoidstart();publicvoidrun();publicvoidstop();}publicclassPersonimplementsRunner{publicvoidstart(){//准备工作:弯腰、蹬腿、咬牙、瞪眼//开跑}publicvoidrun(){//摆动手臂//维持直线方向}publicvoidstop(){//减速直至停止、喝水。}}接口应用举例(2)一个类可以实现多个无关的接口interfaceRunner{publicvoidrun();}interfaceSwimmer{publicdoubleswim();}classCreator{publicinteat(){…}}classManextendsCreatorimplementsRunner,Swimmer{publicvoidrun(){……}publicdoubleswim(){……}publicinteat(){……}}与继承关系类似,接口与实现类之间存在多态性publicclassTest{publicstaticvoidmain(Stringargs[]){Testt=newTest();Manm=newMan();t.m1(m);t.m2(m);t.m3(m);}publicStringm1(Runnerf){f.run();}publicvoidm2(Swimmers){s.swim();}publicvoidm3(Creatora){a.eat();}}接口的其他问题如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类接口也可以继承另一个接口,使用extends关键字。interfaceMyInterface{Strings=“MyInterface”;publicvoidabsM1();}interfaceSubInterfaceextendsMyInterface{publicvoidabsM2();}publicclassSubAdapterimplementsSubInterface{publicvoidabsM1(){System.out.println(“absM1”);}publicvoidabsM2(){System.out.println(“absM2”);}}实现类SubAdapter必须给出接口SubInterface以及父接口MyInterface中所有方法的实现。工厂方法(FactoryMethod)概述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。适用性:1.当一个类不知道它所必须创建的对象的类的时候2.当一个类希望由它的子类来指定它所创建的对象的时候3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候工厂方法举例工厂方法(FactoryMethod)总结:FactoryMethod模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。FactoryMethod解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。代理模式(Proxy)概述:为其他对象提供一种代理以控制对这个对象的访问。interfaceObject{voidaction();}classProxyObjectimplementsObject{Objectobj;publicvoidaction(){System.out.println(代理开始);obj.action();System.out.println(代理结束);}publicProxyObject(){System.out.println(这是代理类);obj=newObjectImpl();}}classObjectImplimplementsObject{publ
本文标题:JSE-08(高级类特性).
链接地址:https://www.777doc.com/doc-2882150 .html