第5章 继承和多态_第1页
第5章 继承和多态_第2页
第5章 继承和多态_第3页
第5章 继承和多态_第4页
第5章 继承和多态_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章进一步讨论对象和类网络中心主要内容类的继承1多态性2final修饰符3抽象类4面向对象编程的三大特征:封装、继承和多态。网络中心主要内容5接口6内部类7匿名类网络中心5.1类的继承人是哺乳动物,因为人都具有哺乳动物的所有特征,但哺乳动物却不一定是人。哺乳动物类和人类之间就存在继承关系(IS-A)。mammalsdogscatshumanslionstigersleopards网络中心5.1类的继承

继承是面向对象三大特征之一,也是实现软件复用的重要手段。当一个类获取另外一个类中所有非私有的数据和操作的定义作为自己的部分或全部成分时。继承的特点通过继承,在已有类型基础之上进行扩充或改造,得到新的数据类型。已有的类型称为父类或超类。得到的新数据类型,称为子类或派生类类的继承提高了程序代码的重用性和可扩充性,缩短了软件开发的周期。网络中心5.1类的继承继承的分类

单继承---------子类只能有一个直接父类

多重继承------子类可以有多个直接父类类A类B类C类A类BJava不支持多重继承网络中心5.1类的继承子类继承父类的语法格式[修饰符]class子类名extends父类名{//子类代码部分}例

编写程序示范子类继承父类的特点。publicclassAnimal{publicdoubleweight;publicvoideat(){System.out.println("动物在吃东西");}}扩展(继承)网络中心5.1类的继承publicclassDogextendsAnimal{publicvoidsay(){System.out.pringln(“狗叫:汪汪汪”);}publicstaticvoidmain(String[]args){Dogd=newDog();

d.weight=150;

d.eat();d.say();}}Dog类中没有定义weight属性和eat方法,是从父类Animal中继承下来,并且访问权限没有发生变化如果定义Java类时并未显示指定这个类的直接父类,则这个类默认扩展java.lang.Object类网络中心5.1类的继承Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类,处在类层次最高点。所有其他的类都是从Object类派生出来的,Object类包含了所有Java类的公共属性,其构造方法是Object()

publicfinalClassgetClass()//获取当前对象所属的类信息,返回Class对象。publicStringtoString()//按字符串对象返回当前对象本身的有关信息。publicbooleanequals(Objectobj) //比较两个对象是否是同一对象,是则返回tectedObjectclone() //生成当前对象的一个拷贝,并返回这个复制对象PublicinthashCode() //返回该对象的哈希代码值。protectedvoidfinalize()throwsThrowable//定义回收当前对象时所需完成的资源释放工作。网络中心5.1类的继承示例比尔盖子的儿子.java类的对象可以使用其父类中定义的公有(及保护)属性和方法,就如同在其自己的类中定义一样

示例TestInheritance.java子类不能直接存取其父类中的私有属性及方法,但可以使用公有(及保护)方法进行存取,子类也不能继承父类的构造方法示例PhoneCard.java网络中心电话卡域:剩余金额方法:拨打电话,查询余额无卡号电话卡域:对应电话机型方法:获得电话机型有卡号电话卡域:卡号,密码,接入号码,接通方法:登录交换机电话磁卡域:使用地域方法:拨打电话电话IC卡域:方法:拨打电话IP卡域:失效日期方法:拨打电话200卡域:附加费方法:修改密码拨打电话继承继承继承继承继承继承域的继承与隐藏子类可以继承父类的所有的非私有域子类可以重新定义一个与从父类哪里继承来的域变量完全相同的变量,而这样会导致在子类有两个相同的名的变量。当子类执行它自己定义的方法时所操作的就是它自己定义的变量,而把继承父类的变量“隐藏”起来。示例:TestHiddenField.java网络中心方法的覆盖与隐藏子类可以继承父类的所有的非私有的方法子类也可以重新定义与父类同名的方法,实现对父类方法的覆盖(OverLoad)示例TestOverLoad.java网络中心网络中心5.1super父类实例的super引用

如果需要在子类方法中调用父类被覆盖的实例方法,可以用super作为调用者来调用父类被覆盖的实例方法。

publicclassOstrichextendsBird{……//子类中原有的内容publicvoidcallOverridedMethod(){super.fly();//输出“我在飞”}

……}在子类中想调用父类被覆盖的方法fly可以通过super关键字实现网络中心5.1super注意:super是Java提供的一个关键字,它是直接父类对象的默认引用。正如this不能出现在static修饰的方法中一样,super也不能出现在static的方法中如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性的情形。子类的方法直接访问该属性时,都会访问到覆盖属性,无法访问父类被覆盖的属性---通过super来访问父类被覆盖的属性如果我们在某个方法中访问名为a的属性,但没有显示指定调用者,系统查找a的顺序为:查找该方法中是否有名为a的局部变量查找当前类中是否包含名为a的属性查找a的直接父类中是否包含名为a的属性,依次上溯a的父类,直到java.lang.Object类,如果最终不能找到名为a的属性,则系统出现编译错误。网络中心5.1super调用父类构造方法

子类不会继承父类的构造方法,但有的时候子类构造方法里需要调用父类构造方法的初始化代码。例写出下面程序的执行结果。classBase{protecteddoublesize;

publicBase(){size=0;System.out.println(“Base类无参构造”);

}publicBase(doubles){size=s;System.out.println(“Base类有参构造”);

}}网络中心5.1superpublicclassSubextendsBase{privateStringcolor;publicSub(){color=“blue”;System.out.println(“Sub类无参构造”);}publicSub(Stringc){color=c;System.out.println(“Sub类有参构造”);

}publicstaticvoidmain(String[]args){Subs1=newSub();Subs2=newSub(“red”);}}当通过子类构造方法创建子类对象时,默认的先执行父类不含参数的构造方法,再执行子类类构造方法。网络中心5.1super要在子类中显式调用直接父类带参数的构造方法,可通过super()调用来实现。例如,publicSub(doubles,Stringc){super(s);//调用Base类中带一个参数的构造方法color=c;System.out.println(“Sub类有参构造”);

}示例:Manager1.javaManager2.java注意:super调用和this调用很像,区别在于super调用的是其父类的构造方法,而this调用的是同一个类中重载的构造方法。因此,使用super调用父类构造也必须出现在子类构造执行体的第一行,所以this调用和super调用不会同时出现。网络中心5.1super子类构造方法调用父类构造方法分如下几种情况:子类构造方法执行体的第一行代码使用super显示调用父类构造方法,系统将根据super调用里传入的实参列表调用父类对应的构造方法。子类构造方法执行体的第一行代码使用this显示调用本类中重载的构造方法,系统将根据this调用里传入的实参列表调用本类另一个构造方法。执行本类中另一个构造方法时即会调用父类的构造方法。子类构造方法执行体中既没有super调用,也没有this调用,系统将会在执行子类构造方法之前,隐式调用父类无参数的构造方法。网络中心实验51.请按如下要求定义两个A和B:类A中定义一个int类型变量z(将其赋值为16)、一个char类型变量x(将其赋值为65)和一个方法myPrint(),该方法的功能是在屏幕上输出z的值和x的值。类B是类A的子类,其中定义了一个double类型的变量y(将其赋值为16.0)和String类型的对象s(将其赋值为javaprogram!),还定义了两个方法myPrint()和printAll(),方法myPrint()的功能是在屏幕上输出y和s的值,方法printAll()的功能是分别调用父类和子类的myPrint()方法。编写应用程序,创建B类的对象b,调用printAll()方法用来显示z、x、y、s的值。网络中心上机实践2.阅读下面程序,回答问题。publicclassA{ publicstaticvoidmain(String[]args){ Aa=newA(); } A(){System.out.println(“A”);} A(inti){this();System.out.println(“AA”);}}classBextendsA{ B(){super();System.out.println(“B”);} B(inti){super(i);System.out.println(“BB”);}}网络中心上机实践(1)程序输出的结果是什么?(2)若将main()方法中的语句改为:Bb=newB(),程序输出的结果是什么?(3)若将main()方法中的语句改为:Bb=newB(1),程序输出的结果是什么?网络中心5.1方法重写重写父类的方法子类扩展父类--总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。例

子类重写父类的方法publicclassBird{publicvoidfly(){System.out.println("我在飞");}}网络中心5.1方法重写publicclassOstrichextendsBird{//重写Bird类的fly方法----方法覆盖(override)publicvoidfly(){System.out.println("我只能在地上奔跑");}publicstaticvoidmain(String[]args){Ostrichos=newOstrich();os.fly();//调用的是Bird的fly还是Ostrich的fly?

Birdbird=newBird();bird.fly();}}重写父类方法网络中心5.1方法重写子类重写父类方法多发生在这三种情况下子类要做与父类不同的事情;在子类中取消这个方法;子类要做比父类更多的事情。重写的同名方法中,子类方法不能比父类方法的访问权限更严格

如果父类中方法method()的访问权限是public,子类中就不能含有private的method(),否则,会出现编译错误。覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。重写方法所抛出的异常不能比原方法更多网络中心5.1方法重写publicclassEmployee{ Stringname; intsalary;

publicStringgetDetails(){ return"Name:"+name+"\n"+ "Salary:"+salary; }}

publicclassManagerextendsEmployee{ Stringdepartment;

publicStringgetDetails(){ return"Name:"+name+"\n"+ "Managerof"+department; }}网络中心5.1方法重写方法重写(override)和方法重载(overload)的区别覆盖是子类和父类之间的关系;而重载是同一类内部多个方法之间的关系。覆盖一般是两个方法间的,而重载可能有多个重载的方法。覆盖的方法有相同的方法名和形参表;而重载的方法只能有相同的方法名,不能有相同的形参表。覆盖时根据调用它的对象来区分方法;而重载是根据形参表来决定调用的是哪个方法。网络中心5.2多态性多态机制是面向对象技术的精华之一,它是建立在继承基础之上的。所谓多态(polymorphism),子类的对象可以代替父类的对象使用。思想基础在类的继承中,子类在父类的基础上进行扩充和改造,父类拥有的成员子类中都有,因而可以认为子类比父类的功能强,或者说子类的对象应该比父类的对象功能强,因而子类的对象应可以替代父类的对象使用。方法的覆盖实现多态方法的重载实现多态示例TestPolymorphism1.java网络中心5.2多态性publicclassTest{ publicstaticvoidmain(String[]args){ Personp=newStudent();// System.out.println(p.getInfo()); }}变量p声明为父类Person的类型,但实际指向的却是子类Student类型的对象网络中心5.2多态性一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。一个引用类型变量可能引用(指向)多种不同类型的对象—既可以引用其声明类型的对象,也可以引用其声明类型的子类的对象。子类对象可以作为父类对象来使用父类对象不能被当作是子类的对象示例TestPolymorphism2.javaclassEmployee{…}classManagerextendsEmployee{…}classDirectorextendsManager{…}Employeeemp=newEmployee();//emp指向职工对象Employeeemp=newManager();//emp指向管理者对象Employeeemp=newDirectotr();//emp指向领导对象Managermgr=newEmployee();×网络中心子类变量不能引用父类对象网络中心5.2多态性在多态情况下,一个引用类型的变量如果声明为父类的类型,但实际引用的是子类对象,则该变量就不能访问子类中添加的属性和方法。可是如果此时调用的是父类中声明过,且在子类中又重写过的方法,情况又将如何?例

多态性示例3name、pricesetName()getName()setPrice()getPrice()show()Book类authorsetAuthor()getAuthor()show()Novel类网络中心5.2多态性转换对象(casting)在多态的情况下,由于对象以其父类的身份出现,对子类中新添加成员的访问受到限制,有时我们可能需要恢复一个对象的本来面目—转换(Casting),以发挥其全部潜力。例

多态性示例。PublicclassTest{ publicvoidcast(Personp){ //System.out.println(p.getSchool());非法

Studentst=(Student)p;//转换 System.out.println(st.getSchool());//正确 }}在main方法中:Testt=newTest();Students=newStudent();s.setSchool(“THU”);t.cast(s);网络中心5.2多态性所谓的转换其实就是引用类型数据值之间的强制类型转换。注意:从子类到父类的类型转换可以自动进行;在多态的情况下,从父类到子类转换必须通过转换(强制类型转换)实现;无继承关系的引用类型间的转换是非法的。Stringstr=“hello,world”;Personp=(Person)str;×网络中心5.2多态性特别强调:从父类到子类的转换也不是都能成功—只有当对象的真正类型本就是子类类型,只是在多态的情况下,被一个声明为父类类型的变量所引用,才可以进行转换处理,即再恢复该对象的本来面目,而一个对象如果其真正类型就是父类类型,是不能被转换为子类类型的。例如,Personp1=newPerson(); Studentstu=(Student)p1;//编译没错,但运行出错网络中心5.2多态性

instanceof运算符再看Test类的cast方法: publicvoidcast(Personp){ //System.out.println(p.getSchool());非法

Studentst=(Student)p;//转换 System.out.println(st.getSchool());//正确 }调用方法时如果实参是子类Student的对象,则转换是正确的,若实参是父类Person的对象,则转换失败!

if(pinstanceofStudent){

Studentst=(Student)p;st.getSchool();

}网络中心5.2多态性运算符instanceof用于检测一个对象的真正类型。格式:<变量名>instanceof<类型>功能:如果instanceof操作符左侧的变量当前时刻所引用对象的真正类型是其右侧给出的类型、或是其子类,则整个表达式结果为true,否则结果为false。示例TestPolymorphism1.java方法的重载重载不是子类对父类同名方法的重新定义,而是类对自身已有的方法的重新定义.示例TestOverride5_10.java网络中心构造函数的重载一个类可以有多个构造函数,用来完成不同的初始化任务。不同构造函数的形式参数个数、类型、顺序不同;严格来说子类不继承父类的构造函数,但有一定的关系:1)如果子类没有构造函数,那么在创建子类对象时将调用父类无参数构造函数2)如果子类自己定义了构造函数,则在创建子类对象时,先隐含执行父类无参数构造函数,然后再执行子类的构造函数3)如果子类自己定义的构造函数中,利用super关键字显示调用父类的构造函数,系统将不在隐含调用父类的无参数构造函数示例TestCons5_11.java网络中心网络中心上机实践1.定义类A和类B如下:classA{ floatvar=1.1f; floatmethod(){ returnvar; }}classBextendsA{ floatvar=2.2; floatmethod(){returnvar;}}(1)类A和类B是什么关系?(2)类A和类B中都定义了变量var和方法method(),这种现象称为什么?(3)若定义Aa=newA(),则a.var和a.method()的值是多少?(4)若定义Aa=newB(),则a.var和a.method()的值是多少?(5)若定义Aa=newB(),Bb=(B)a,则b.var和b.method()的值是多少?网络中心实验6实验题目:请编程实现如下需求。乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin);这两种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,

1.程序1要求:编写方法testPlay,对这两种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏测试。在main()方法中进行测试。

2.程序2要求:不使用面向对象的多态性,对这两种乐器进行弹奏测试。在main()方法中进行测试。实验目的:理解面向对象的多态性。

网络中心5.3final修饰符它既可以用来修饰一个类,也可用于修饰类中的成员变量或成员方法。用这个关键字进行修饰的类或类的成员都是不能改变的。如果一个方法被定义为final,则不能被重写;如果一个类被定义为final,它不能有子类。网络中心5.3final—终极类被标记为final的类将不能被继承,这样的类可以称之为终极类(finalclass)其声明的格式为:finalclassfinalClassName{ ........}

网络中心5.3final—终极类finalpublicclassFinalClass{ intmemberar; voidmemberMethod(){};}

classSubFinalClassextendsFinalClass{ intsubmembervar; voidsubMemberMethod(){};}

在编译时会出现以下错误信息:SubFinalClass.Java:7:Can'tsubclassfinalclasses:classFinalClassclassSubFinalClassextendsFinalClass{

网络中心5.3final—终极方法成员方法被标记为final成为终极方法(finalmethod),被标记final的方法将不能被重写

安全考虑。这样调用final类型的方法时可以确保被调用的是正确的、原始的方法标记为final有时也被用于优化

终极方法的定义格式为:finalreturnTypefinalMethod([paramlist]){ ........}网络中心5.3final—终极方法classFinalMethodClass{ finalvoidfinalMethod(){ … //原程序代码 }}classOverloadClassextendsFinalMethodClass{ voidfinalMethod(){ //错误! … //子程序代码 }}

网络中心5.3final—终极变量一个变量被标记为final,则会使它成为一个常量

classConst{ finalfloatPI=3.14f; finalStringlanguage="Java";}

publicclassUseConst{ publicstaticvoidmain(Stringargs[]){ Constmyconst=newConst(); myconst.PI=3.1415926f; }}

在编译时会出现以下错误信息:UseConst.Java:9:Can'tassignavaluetoafinalvariable:PImyconst.PI=3.1415926f;网络中心5.3final—终极变量将程序中可能用到的一系列常量定义在一个类中,其他类通过引入该类来直接使用这些常量,保证常量使用的统一,修改提供方便

将一个引用类型的变量标记为final,那么这个变量将不能再指向其他对象,但它所指对象的取值仍然是可以改变的(写一个测试类)网络中心5.3final—终极变量classCar{ intnumber=1234;}classFinalVariable{ publicstaticvoidmain(Stringargs[]){ finalCarmycar=newCar();

mycar.number=8888; //可以!

mycar=newCar(); //错误! }}

网络中心5.4抽象类抽象方法基类中定义的方法,有时候只有在派生类中才能写出方法体。例如,ShapeTwoDimensionalShapeThreeDimensionalShapeRectangleCircleEllipseCubeSphereCylinder需定义方法area()计算面积,能写出合适的方法体?网络中心5.4抽象类Java中,这种没有方法体的方法称为抽象方法。抽象方法声明格式:

[修饰符]

abstract

返回值类型方法名([形式参数表]);抽象方法的特点抽象方法的返回值类型前有关键字abstract;抽象方法没有方法体;抽象方法的定义是一行单独语句,以分号结束;在抽象方法声明中使用static修饰符是错误的。例如,publicabstractdoublearea();网络中心5.4抽象类抽象类类中如果定义了抽象方法,这个类必须定义为抽象类。[public]abstractclass类名{//类体(属性、非抽象方法、抽象方法、构造方法)//类体(初始化块、内部类、枚举类)}抽象类不能创建自己的对象,使用new创建抽象类对象将产生错误。子类继承抽象类时,应该覆盖抽象类中的所有抽象方法,否则子类也必须定义为抽象类。网络中心5.4抽象类注意含有抽象方法的类(包括直接定义了一个抽象方法;继承了一个抽象父类,但没有完全实现父类包含的抽象方法)只能被定义成抽象类。但抽象类中却并不一定包含抽象方法。抽象方法和空方法体的方法不是同一个概念

publicabstractvoidtest();

publicvoidtest(){}是一个抽象方法,它根本没有方法体,即方法定义后面没有一对花括号一个普通方法,定义了方法体,只是方法体为空,因此这个方法不可以使用abstract来修饰网络中心5.4抽象类例

抽象类示例。publicabstractclassShape{publicabstractdoublecalcArea();publicShape(){}publicShape(Stringname){ System.out.println(name+"ShapeCreated");}publicStringtoString(){ System.out.println(“thisisShape!”);}}抽象方法构造方法不用于创建Shape对象,而是用于被子类调用抽象类,不能实例化的网络中心5.4抽象类publicclassCircleextendsShape{publicfloatr;privatefinalfloatPI=3.14;publicCircle(Stringname,floatr){ super(name); this.r=r;}publicfloatcalcArea(){ returnPI*r*r;}}子类Circle,必须重写Shape类中的抽象方法,否则Circle就是一个抽象类网络中心5.4抽象类注意final和abstract永远不能同时使用。abstract不能用于修饰属性,不能用于修饰局部变量,即没有抽象变量、没有抽象属性等说法;abstract也不能用于修饰构造方法,没有抽象构造方法。抽象类里定义的构造方法只能是普通构造方法。static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限。网络中心5.4抽象类抽象类的作用代码重用--子类可以重用抽象父类中的属性和非抽象方法;规划--抽象类中通过定义抽象方法规划了其所有子类必须要实现的功能,或者说指定了其子类对象与外界的交互界面,因为抽象方法的方法头部分已经规定了该方法将来被子类对象调用的格式。模板模式的设计网络中心5.4抽象类模板模式:抽象类作为多个子类的通用模板,子类在抽象类的基础上扩展、改造,但子类总体上会保留抽象类的行为方式。抽象类不能实例化,但抽象类可作为变量的类型和方法形参类型,可将抽象类子类的对象赋给该变量或做方法的实参。例如,

Shapes=newRectangle();

publicstaticStringShowShapinfo(Shapeitem){

if(iteminstanceofRectangle){

Rectangler=(Rectangle)item;//其他代码

}

}网络中心5.5接口接口是另一种定义数据类型的方式。它和类非常相似的。相同之处:都有成员变量和成员方法也可以形成继承关系不同之处:接口中的属性都是常量(final)接口中的方法是抽象方法(没有方法体)引入接口的原因:Java只支持单重继承,每个类只能有一个超类。但实际应用中有时候需要多重继承--使用接口,一个类可以实现多个接口。接口的概念类比:计算机的USB口网络中心5.5接口接口的定义[public]interface

接口名[implements

父接口1,父接口2,…]{

[public][static][final]数据类型属性名=常量值;

[publicabstract]返回值类型方法名([形参表]);}表示可以被不同包中的类或接口使用,缺省时具有包内可访问性interface关键字表示接口任意有效标识符接口支持多继承,多个父接口之间用逗号分隔接口的属性必须用publicstaticfinal修饰,是系统默认的,可部分省略或全部省略,但一般都写出final。

intMAX_SIZE=50;等价于

publicstaticfinal

intMAX_SIZE=50;接口的方法默认为publicabstract,一般不写修饰符,可省略--接口中的方法都是抽象方法。网络中心5.5接口例

接口的定义。interfacePCI{//定义了一个PCI接口

publicvoidstart();//定义了一个开始的方法

publicvoidstop();//定义了一个结束的方法,默认都是抽象方法。}

示例:NetworkCard.javaUsePCI.java

接口定义后不能直接创建对象,必须由类实现接口后创建类的对象。每个类只能继承一个基类,但可以实现多个接口。类定义形式如下:网络中心5.5接口[public]class类名extends基类implements

接口1,…{

//类体}注意:类实现接口,就继承了接口中的所有成员变量和成员方法。由于接口中的方法都是抽象的,因此实现接口的类必须重写这些方法。classSoundCardimplementsPCI{//声卡publicvoidstart(){System.out.println("Dudu...");

}publicvoidstop(){System.out.println("Soundstop!");

}}可实现多个接口,多个接口之间用逗号分隔网络中心5.5接口注意:实现接口中的抽象方法时,除去掉关键字abstract外,方法头必须和接口定义中的方法头完全相同,并且public修饰符不能省略。如果类实现了多个接口,必须重写这些接口中的所有方法。接口不是类,不能使用new实例化接口,但可以声明接口变量。接口变量可以指向一个实现了该接口的类的对象,例如,

PCIs=newPCI();//错

PCIs=newSoundCard();//对

网络中心5.5接口可以使用instanceof来判断对象是否实现了某个接口。虽然可以使用接口变量来引用实现接口类的对象,但这种引用只能引用接口的成员,否则会发生编译错误。例如,PCInet=newNetworkCard();PCIsound=newSoundCard();net.start();sound.start();调用的是同一方法吗?多态强调:一个接口定义一个协定,实现接口的类必须遵守其协定。接口最适合为不相关的类提供通用功能,利用接口提供的方法,程序可以多态地处理这些完全不同的类的对象。网络中心5.5接口接口的继承接口具有多重继承的特点,即一个接口可以有多个父接口。新的子接口继承所有父接口的全部方法和常量。接口继承的格式为:[public]interface子接口extends

父接口{//静态属性;

//抽象方法;}网络中心5.5接口程序InterfaceTester接口应用实例。定义一个接口Shape2D,可利用它来实现二维的几何形状类Circle和Rectangle网络中心5.5接口接口和抽象类接口和抽象类很像,它们都具有如下特征:接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。区别设计目的不同接口体现的是一种规范,类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准。因此一个系统中的接口不应该经常改变抽象类作为多个子类的共同父类,体现的是模板式设计。抽象类可以被当成系统实现过程中的中间产品,这个中间产品已经实现了部分功能,但这个产品还不能当成最终产品,必须更进一步的完善,这种完善可能有几种不同方式。网络中心5.5接口用法不同(1)接口里只能包含抽象方法(2)接口里不能定义静态方法(3)接口里只能定义静态常量属性(4)接口不包含构造方法(5)一个类可以实现多个接口(1)抽象类可以包含普通方法。(2)抽象类可以定义静态方法

(3)抽象类既包含普通属性,也可以包含静态常量属性

(4)抽象类里构造方法不用于创建对象,是让子类调用(5)一个只能继承一个父类网络中心5.5接口-实例软件项目开发数据库操作功能模块1前台页面接口功能模块2功能模块3网络中心5.5接口SqlserverDataOperate、MysqlDataOperate,分别代表Oracle、Sqlserver、Mysql这三种数据库的操作类。DataOperate是上面说的数据操作类的统一接口,只有两个方法:取得一条记录、插入一条记录。DataOperateFactory是一个工厂方法,统一用它的方法来得到数据库操作类的实例。SampleClass是我们系统的某个功能模块的类。people是一个实体类,代表一条记录。三个字段oid唯一标识符、name姓名、date生日。网络中心5.5接口public

interface

DataOperate

{

//根据记录的唯一标识取出一条记录

People

getPeople(String

oid);

//插入一条记录

boolean

insertPeople(People

people);

}

网络中心5.5接口OracleDataOperate、SqlserverDataOperate、MysqlDataOperate都是继承DataOperate接口public

class

MysqlDataOperateimplementsDataOperate

{

//根据记录的唯一标识取出一条记录

People

getPeople(String

oid){ //读取Mysql数据库的People表,返回该记录

}

//插入一条记录

boolean

insertPeople(People

people){ //读取Mysql数据库的People表,插入一条记录}

}

网络中心5.5接口功能模块中如何操作数据库呢?/***系统某个功能类*/publicclassSampleClass{/**某方法*/publicvoidsampleMethod(){DataOperatedb=newMysqlDataOperate();

Peoplep=db.getPeople("123");//取得一条记录db.insertPeople(p);//再插回去}}有何不足?网络中心5.5接口publicclassDataOperateFactory{publicstaticfinalintORACLE=0;//定义三个表示数据库类型的常量publicstaticfinalintMYSQL=1;publicstaticfinalintSQLSERVER=2;

privatestaticDataOperatedb;privatestaticintdataType=1;/***@return返回的是接口,客户端不必关心具体是用哪个实现类*/publicstaticDataOperategetInstance(){if(db==null){if(dataType==ORACLE)//根据dateType返回相应的实现类returnnewOracelDataOperate();if(dataType==MYSQL)returnnewMysqlDataOperate();if(dataType==SQLSERVER)returnnewSqlserverDataOperate();}returndb;}}网络中心5.5接口/***系统某个功能类*/publicclassSampleClass{privateDataOperatedb;//声明一个数据库操作类,注意这里用的是接口/**某方法*/publicvoidsampleMethod(){db=DataOperateFactory.getInstance();//得到单一实例Peoplep=db.getPeople("123");//取得一条记录db.insertPeople(p);//再插回去}}网络中心上机实践1.定义一个接口,接口中有三个抽象方法:longfactorial(intm);//求参数的阶乘longmyPower(intm,intn);//求参数m的n次方booleanfindFactorSum(intm,intn);//判断参数中较小数是否是较大数的因子定义类实现该接口。编写应用程序,调用接口中的三个方法,并将调用这些方法得到的结果输出。网络中心5.6内部类一个Java程序就是一个类的集合。程序中的类有两种排列结构。类1Java程序类2类n……外部类Java程序内部类类k……在一个类中定义其它类网络中心5.6内部类例如:classEnclosingClass{

……classANestedClass{

……

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论