版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《类的继承性》幻灯片本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!《类的继承性》幻灯片本课件PPT仅供大家学习使用《类的继承性》教学课件《类的继承性》教学课件《类的继承性》教学课件《类的继承性》教学课件访问控制权限了解
访问控制权限了解第3讲面向对象编程〔高级篇〕第3讲面向对象编程〔高级篇〕面向对象编程〔根底篇〕知识回忆面向对象编程〔根底篇〕知识回忆主要内容3.1继承性3.2多态性3.3抽象类3.4接口3.5内部类和匿名类3.1继承的作用3.2子类对象的创立3.3在子类中访问父类的成员3.4覆盖父类的方法主要内容3.1继承性3.1继承的作用继承Person-name:String-age:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):voidStudent-name:String-age:String-school:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):void+getSchool():String+setSchool(Strings):void为什么引入继承的特性?模仿人类的思维方式—人类的继承性继承Person-name:String+getNamPerson类classPerson{privateStringname;privateintage;publicStringgetName(){returnname;}
publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}}Student类classStudent{privateStringname;privateintage;privateStringschool;publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}publicStringgetSchool{returnschool;}publicvoidsetSchool(Strings){school=s;}}Person类Student类继承为什么引入继承的特性?模仿人类的思维方式—人类的继承性2.程序的代码重用性—少写代码继承为什么引入继承的特性?模仿人类的思维方式—人类的继承性2继承关系格式:class父类{……}class子类extends
父类{……}试验!eXTdEMO1.JAVAeXTdEMO2.JAVA继承关系格式:class父类试验!eXTdEMO1.JAVQQ牧场的设计目的:了解在真实系统中进展设计时如何进展继承层次的设计?QQ牧场的设计目的:了解在真实系统中进展设计时如何进展继承层①找出对象的共同属性和行为这个程序必须能够在任何时候参加新类型的动物。首先要区分出所有动物都有的、抽象的共同特征,然后以这些共同特征设计出能够让所有动物加以扩大的类。考虑:这6种动物有什么共同特点?这些类型有什么相关性?①找出对象的共同属性和行为这个程序必须能够在任何时①找出对象的共同属性和行为5个实例变量: picture:动物JPEG图像的名称 food:此动物所吃的食物(meat/grass) hunger:代表饥饿程度的int值。会根据动物吃了多少食物而改变。 boundaries:代表动物活动范围区域的长宽。 location:动物在活动区域中的位置。4个实例方法:
makeNoise():动物发出声音的行为和程序。 eat():动物遇到食物时的行为程序。 sleep():睡眠的行为程序。 roam():不在进食或睡眠时的行为程序。①找出对象的共同属性和行为5个实例变量:②设计代表共同状态与行为的类Animal-Stringpictual-Stringfood-inthunger-Positionboudaries-PositionlocationvoidmakeNoise()voideat()voidsleep()voidroam()LionCatTiggerHippoDogWolf②设计代表共同状态与行为的类Animal-String③决定子类是否需要让某项行为有特定的不同的运行方式Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggerHippoDogWolf③决定子类是否需要让某项行为有特定的不同的运行方式Anima③决定子类是否需要让某项行为有特定的不同的运行方式Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()③决定子类是否需要让某项行为有特定的不同的运行方式Anima④寻找更多抽象化的时机Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()④寻找更多抽象化的时机Animal成员变量voidm⑤完成类的继承层次Animal。。。。。。。。。。。。LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()Feline……roam()Canine……roam()⑤完成类的继承层次Animal。。。。。。。。。。。。Lio⑤完成类的继承层次④寻找更多抽象化的时机③决定子类是否需要让某项行为有特定的不同的运行方式②设计代表共同状态与行为的类如何进展继承层次的设计--自下而上的设计
①找出对象的共同属性和行为⑤完成类的继承层次④寻找更多抽象化的时机③决定子类是否需要让子类对象调用成员的原那么AnimalmakeNoise()eat()sleep()roam()WolfvoidmakeNoise()voideat()Canine……roam()创建大野狼对象Wolfw=newWolf();调用大野狼的方法w.makeNoise();调用犬科的方法w.roam();调用动物的方法w.sleep()最低阶原那么子类对象调用成员的原那么AnimalmakeNoise()W③添加子类的新成员②改造父类的成员①继承父类的成员父类如何进展子类设计--自上而下的设计
③添加子类的新成员②改造父类的成员①继承父类的成员父类访问控制权限了解
访问控制权限了解③添加子类的新成员②改造父类的成员①继承父类的成员父类如何进展子类设计--自上而下的设计
③添加子类的新成员②改造父类的成员①继承父类的成员父类子类对象的创立一、子类对象的实例化过程二、super的作用子类对象的创立一、子类对象的实例化过程子类的创立一、子类对象的实例化过程classPerson{ publicPerson()父类构造〞);}}classStudent{ publicStudent()子类构造〞);}}子类的创立一、子类对象的实例化过程子类对象的创立一、子类对象的实例化过程publicclassTestDemo11{ publicstaticvoidmain(Stringargs[]){
Studentstu=newStudent(); }}运行结果:
?子类对象的创立一、子类对象的实例化过程运行结果:?子类对象的创立一、子类对象的实例化过程1、先自动调用父类构造函数〔父类中的无参构造函数〕2、然后调用子类构造函数注意:如果父类中有多个构造方法时,如何才能调用父类中某个特定的构造方法呢?其做法是在子类的构造方法中通过super〔…〕来调用父类特定的构造方法。子类对象的创立一、子类对象的实例化过程创立子类二、super()、super(……)classPerson{ privateStringname; privateintage; publicPerson() {调用Person类的无参构造方法〞);} publicPeron(Stringname,intage)调用了Person类的有参构造方法〞); =name; this.age=age;} publicvoidshow() {姓名:〞+name+〞年龄:〞+age);} }创立子类二、super()、super(……)子类对象的创立classStudentextendsPerson{ privateStringdepartment; publicStudent()无参构造〞);} publicStudent(Stringname,intage,Stringdep) {super(name,age); department=dep;我是〞+department+〞的学生〞);有参构造〞);}}子类对象的创立classStudentextendsP子类对象的创立publicclassTestDemo1{ publicstaticvoidmain(Stringargs[]){ Studentstu1=newStudent(); Studentstu2=newStudent(“李四〞,23,〞计算机系〞); stu1.show(); stu2.show(); }}子类对象的创立publicclassTestDemo1{子类对象的创立省略红色字体super(name,age),父类中的构造方法哪个会被调用?子类构造方法中调用父类构造方法的super语句位置有没有限制?如果父类中只定义了有参的构造方法,而子类的构造方法中并没有显式的用super〔〕来调用父类中特定的构造方法,程序此时会有问题吗?找出this和super的一样点和不同点。思考!!!找出继承中构造方法的调用规那么子类对象的创立省略红色字体super(name,age),父成员变量的隐藏和方法的覆写〔1〕当在子类中定义的成员变量和父类中的成员变量同名时,此时称子类的成员变量隐藏了父类的成员变量。改造父类的成员〔2〕当子类中定义了一个方法,并且这个方法的名字,返回类型,参数个数以及类型和父类的某个方法完全一样时,父类的这个方法将被隐藏,这时我们说重写了父类的方法。子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。成员变量的隐藏和方法的覆写〔1〕当在子类中定义的成员变量和父成员变量的隐藏和方法的覆写例如下面的这段程序就是这样的情况:classSuperClass{//父类
inty;
voidsetY(){y=0;}}classSubClassextendsSuperClass{inty;//父类变量y被隐藏
voidsetY(){//重写父类的方法setY()y=1;}}publicTestDemo3{publicstaticvoidmain(Stringargs[]){
SubClassss=newSubClass();
ss.setY();}}成员变量的隐藏和方法的覆写例如下面的这段程序就是这样的情况:
子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。this用来引用当前对象,与this类似,super用来引用当前对象的父类。super的使用可以分为下面三种情况:
1)用来访问父类被隐藏的成员变量,如:
super.y2)用来调用父类中被重写的方法,如:
super.setY()
3)用来调用父类的构造方法,如:
super([paramlist]);成员变量的隐藏和方法的覆写思考:方法的重载与覆写非常类似,找出它们的区别!!!子类在隐藏了父类的成员变量或重写了父类课后讨论讨论二类的继承性与多态性〔1〕主题一:方案设计分析主题三:知识原理掌握—构造方法的重载思考:〔1〕找出父类向子类派生时,构造方法的调用规律〔2〕找出方法的重载与重写的区别课后讨论讨论二类的继承性与多态性〔1〕主题一:方案设计分析写出你所能想到的所有二维、三维形状,并用它们组成一个形状层次构造。层次构造把Shape当作超类,并从中派生出TwoDimensionalShape类和ThreeDimensionalShape类。设计这个层次构造,并定义它的所有类。画出相应的类层次构造图。接下来考虑如果将Shape类变成abstract超类,TwoDimensionalShape类和hreeDimensionalShape类也是abstract类。进展相应的派生后,要求在第三层的类中计算出每个类对应对象的面积和体积。主题一:方案设计分析写出你所能想到的所有二维、三维形状,并用主题三:知识原理掌握—构造方法的重载建立一个人类〔Person〕和学生类〔Student〕,功能要求如下:〔1〕Person中包含4个保护型的数据成员name、addr、sex、age,表示姓名、地址、性别和年龄。用一个4参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,用一个输出方法显示4种属性。〔2〕Student类继承Person类,并增加输出成员math、english存放数学、英语成绩。用一个6参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,另外重写输出方法用于显示6种属性。主题三:知识原理掌握—构造方法的重载建立一个人类〔Perso第3章面向对象高级程序设计3.1继承3.2多态性3.3抽象类和抽象方法3.4接口3.5内部类和匿名类第3章面向对象高级程序设计3.1继承3.2多态性多态(Polymorphism)的意思就是用一样的名字来定义不同的方法。在Java中,普通类型的多态为重载,这就意味着可以使几个不同的方法使用一样的名字,这些方法以参数的个数不同、参数的类型不同等方面来进展区分,以使得编译器能够进展识别。也可以这样讲,重载是同一个方法具有不同的版本,每个版本之间在参数特征方面有差异。重载是Java实现多态性的方式之一。例如:family()方法可以有三个版本,如下:family(){}family(Stringch){address=ch;}family(Stringch,floatn){address=ch;pay=n;}这些方法并存于程序中,编译时,编译器根据实参的类型和个数来区分从而调用那个方法。如果这些方法作为函数或过程同时出现在其它语言的程序中,如C,那将导致灾难性的错误。3.2多态性多态(Polymorphism3.2多态性【例3-6】构造方法重载的例子classperson{Stringname="Johnson";//姓名
intage=45;//年龄
person(){}
person(Stringa){name=a;}
person(Stringa,intb){name=a;age=b;}name+","+"Age="+age);}}publicclassPoly{publicstaticvoidmain(String[]args){personko1=newperson();personko2=newperson("Mike");personko3=newperson("Willian",50);ko1.display();ko2.display();ko3.display();}}3.2多态性【例3-6】构造方法重载的例子3.2多态性在Java语言中,多态性主要表达在两个方面:由方法重载实现的静态多态性〔编译时多态〕和方法重写实现的动态多态性〔运行时多态〕,如下:
1〕编译时多态
在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
2〕运行时多态
由于子类继承了父类所有的属性〔私有的除外〕,所以子类对象可以作为父类对象使用。程序中但凡使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。如果子类重写了父类的方法,那么重写方法的调用原那么如下:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,那么运行时系统调用子类的方法;如果子类继承了父类的方法〔未重写〕,那么运行时系统调用父类的方法。另外,方法重写时应遵循的原那么如下:改写后的方法不能比被重写的方法有更严格的访问权限。改写后的方法不能比被重写的方法产生更多的异常。进展方法重写时必须遵从这两个原那么,否那么编译器会指出程序出错。3.2多态性在Java语言中,多态性主要表达在两3.2多态性【例3-7】方法重写的例子classParent{publicvoidfunction(){}}classChildextendsParent{
privatevoidfunction(){}}publicclassRTpolyTest{publicstaticvoidmain(Stringargs[]){Parentpl=newParent();Parentp2=newChild();p1.function();p2.function();}}3.2多态性【例3-7】方法重写的例子3.2多态性编译过程如下:D:\user\chap05>JavacRTpolyTest.javaRTpolyTest.java:8:function()inChildcannotoverridefunction()inParent;attemptingtoassignweakeraccessprivileges;waspublicprivatevoidfunction(){^RTpolyTest.java:16:cannotfindsymbolsymbol:variablep1location:classRTpolyTestp1.function();^2errors可以看出,该程序中实例p2调用function()方法时会导致访问权限的冲突。
3.2多态性编译过程如下:第3章面向对象高级程序设计3.1继承3.2多态性3.3抽象类和抽象方法3.4接口3.5内部类和匿名类第3章面向对象高级程序设计3.1继承3.3抽象类和抽象方法Java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类。一个abstract类只关心它的子类是否具有某种功能,并不关心该功能的具体实现,功能的具体行为由子类负责实现的。例如:
publicabstractclassDrawing{publicabstractvoiddrawDot(intx,inty);publicvoiddrawLine(intx1,inty1,intx2,inty2){…………}}
用abstract来修饰一个方法时,该方法叫做抽象方法。与final类和方法相反,abstract类必须被继承,abstract方法必须被重写。
3.3抽象类和抽象方法Java语言中,用abs3.3抽象类和抽象方法
当一个类的定义完全表示抽象的概念时,它不应该被实例化为一个对象。例如Java中的Number类就是一个抽象类,它只表示数字这一抽象概念,只有当它作为整数类Integer或实数类Float等的父类时才有意义。定义一个抽象类的格式如下:
abstractclassabstractClass{……}
由于抽象类不能被实例化,因此下面的语句会产生编译错误:
newabstractClass();抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,对抽象方法只需声明,而不需实现,因此它没有方法体。其格式如下:
abstracreturnTypeabstractMethod([paramlist));
3.3抽象类和抽象方法当一个类的定义完全表示抽象使用abstract的另一例子abstractclassAA{abstractvoidcallme();voidmetoo(){}}classBBextendsAA{voidcallme(){}}publicclassAAbstract{publicstaticvoidmain(Stringargs[]){AAcc=newBB();//cc为上转型对象
cc.callme();cc.metoo();}}
使用abstract的另一例子abstractclass第3章面向对象高级程序设计3.1继承3.2多态性3.3抽象类和抽象方法3.4接口3.5内部类和匿名类第3章面向对象高级程序设计3.1继承3.4接口接口声明使用接口的优点3.4接口接口声明接口声明从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。通过接口使得处于不同层次,甚至互不相关的类可以具有一样的行为。接口其实就是方法定义和常量值的集合。它的优点主要表达在下面几个方面:(1)通过接口可以实现不相关类的一样行为,而不需要考虑这些类之间的层次关系。(2)通过接口可以指明多个类需要实现的方法。(3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。接口把方法的定义和类的层次区分开来,通过它可以在运行时动态地定位所调用的方法。同时接口中可以实现“多重继承〞,且一个类可以实现多个接口。正是这些机制使得接口提供了比多重继承〔如C++等语言〕更简单、更灵活、而且更强劲的功能。接口声明从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包接口声明Java不支持多继承性,即一个类只能有一个父类。单继承性使得Java类层次简单,易于程序的管理。为了抑制单继承的缺点,Java使用了接口,一个类可以实现多个接口。使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体两局部。1、接口声明我们曾使用class关键字来声明类,接口通过使用关键自interface来声明.完整的接口定义格式如下:[public]interfaceinterfaceName[extendslistOfSuperInterface]{……}其中public修饰符指明任意类均可以使用这个接口,缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。extends子句与类声明中的extends子句根本一样,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有的常量和方法。通常接口名称以able或ible结尾,说明接口能完成一定的行为,例如Runnable、Serializable。接口声明Java不支持多继承性,即一个类只能有一接口声明2、接口体接口体中包含常量定义和方法定义两局部。其中常量定义局部定义的常量均具有public、static和final属性。其格式如下:returnTypemethodName([paramlist]);接口中只能进展方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号(;)结尾,在接口中声明的方法具有public和abstract属性。另外,如果在子接口中定义了和父接口同名的常量,那么父接口中的常量被隐藏。例如:interfaceSummaryable{finalintMAX=50;//MAX具有public、static、final属性voidprintone(floatx);floatsum(floatx,floaty);}上面这段程序可以以Summaryable.java来保存,也可以写入其它Java程序中。接口声明2、接口体接口声明3、接口的使用一个类通过使用关键字implements声明自己使用〔或实现〕一个或多个接口。如果使用多个接口,用逗号隔开接口名。如classCalculateextendsComputerimplementsSummary,Substractable{……}类Calculate使用了Summary和Substractable接口,继承了Computer类。如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。需要注意的如下:1〕在类中实现接口的方法时,方法的名字,返回类型,参数个数及类型必须与接口中的完全一致。2〕接口中的方法被默认是public,所以类在实现接口方法时,一定要用public来修饰。3〕另外,如果接口的方法的返回类型如果不是void的,那么在类中实现该接口方法时,方法体至少要有一个return语句。如果是void型,类体除了两个大括号外,也可以没有任何语句.接口声明3、接口的使用使用接口的优点【例3-9】
使用多重接口的例子//MultInterfaces.javainterfaceI1{abstractvoidtest(inti);}interfaceI2{abstractvoidtest(Strings);}publicclassMultInterfacesimplementsI1,I2{publicvoidtest(inti){}publicvoidtest(Strings){}publicstaticvoidmain(String[]a){MultInterfacest=newMultInterfaces();t.test(42);t.test("Hello");}}使用接口的优点【例3-9】使用多重接口的例子第3章面向对象高级程序设计3.1继承3.2多态性3.3抽象类和抽象方法3.4接口3.5内部类和匿名类第3章面向对象高级程序设计3.1继承3.5内部类和匿名类内部类的定义内部类特性匿名类3.5内部类和匿名类内部类的定义内部类的定义简单地说,一个类被嵌套定义于另一个类中,称为嵌套类。在大多数情况下,嵌套类〔静态的嵌套类除外)就是内部类〔innerclass〕。包含内部类的类称为外部类。与一般的类一样,内部类具有自己的成员变量和成员方法。通过建立内部类的对象,可以存取其成员变量和调用其成员方法。例如下面的例子:pubicclassGroupOne{intcount;//外部类的成员变量publicclassStudent{//声明内部类Stringname;//内部类的成员变量publicvoidoutput(){//内部类的成员方法;}}}内部类的定义简单地说,一个类被嵌套定义于另一个类内部类的定义实际上,Java语言标准对于内部类有如下的规定:在另一个类或者一个接口中声明一个类。在另一个接口或者一个类中声明一个接口。在一个方法中声明一个类。类和接口声明可嵌套任意深度。从上面的规定中我们可以看出,内部类的定义是非常灵活的。内部类的定义实际上,Java语言标准对于内部类内部类特性内部类有如下特性:一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。名称不能与包含它的类名一样。可以使用包含它的外部类的静态成员变量和实例成员变量,也可以使用它所在方法的局部变量。可以定义为abstract。可以声明为private或protected。假设被声明为static,就变成了顶层类,不能再使用局部变量。假设想在内部类中声明任何static成员,那么该内部类必须声明为static。Java将内部类作为外部类的一个成员,就如同成员变量和成员方法一样。因此外部类与内部类的访问原那么是:在外部类中,通过一个内部类的对象引用内部类中的成员;反之,在内部类中可以直接引用它的外部类的成员,包括静态成员、实例成员及私有成员。内部类特性内部类有如下特性:内部类特性【例3-10】内部类和外部类之间的访问本例的类GroupTwo中声明了成员变量count、内部类Student、实例方法output和main方法,在内部类Student中声明了构造方法和output方法,构造方法存取了外部类GroupTwo的成员变量count。程序运行结果:Johnsoncount=1本例演示嵌套的两个类之间的访问规那么,即在外部类GroupTwo中,通过一个内部类Student的对象s1可以引用内部类中的成员;反之,在内部类Student中可以直接引用它的外部类的成员,如count。本例的外部类GroupTwo中有实例方法output(),内部类Student中也有实例方法output(),两者虽然同名,却表达不同含义。使用时,外部类GroupTwo的对象调用GroupTwo的output,如g2.output(),内部类Student的对象调用Student的output,如s1.output()。内部类特性【例3-10】内部类和外部类之间的访问内部类特性publicclassGroupTwo{//例5-10privateintcount;//外部类的私有成员变量
publicclassStudent{//声明内部类
Stringname;publicStudent(Stringn1){name=n1;count++;//存取其外部类的成员变量
}publicvoidoutput(){}}publicvoidoutput(){//外部类的实例成员方法
Students1=newStudent("Johnson");//建立内部类对象"s1.output();//通过s1调用内部类的成员方法
}publicstaticvoidmain(Stringargs[]){GroupTwog2=newGroupTwo();g2.output();}}内部类特性publicclassGroupTwo{内部类特性【例3-11】内部类访问外部静态变量
GroupThree.java【例3-12】静态公用内部类
GroupFour.java【例3-13】抽象内部类
GroupFive.java【例3-14】内部接口
GroupSix.java【例3-15】局部内部类
GoogsSeven.java内部类特性匿名类匿名类是不能有名称的类,所以没方法引用它们。必须在创立时,作为new语句的一局部来声明它们。要采用另一种形式的new语句,如下所示:
new<类或接口><类的主体>
这种形式的new语句声明一个新的匿名类,它对一个给定的类进展扩展,或者实现一个给定的接口。它还创立那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
有关匿名类的使用详见本书第12章本分内容。内部和匿名类是Java为我们提供的两个出色的工具。它们提供了更好的封装,结果就是使代码更容易理解和维护,使相关的类都能存在于同一个源代码文件中〔这要归功于内部类〕,并能防止一个程序产生大量非常小的类〔这要归功于匿名类〕。匿名类匿名类是不能有名称的类,所以没方法引用它们。必须在创立匿名类例子
f=newFrame("Innerclassesexample");
tf=newTextField(30);
}
匿名类例子f=newFrame("InnerpublicvoidlaunchFrame(){
Labellabel=newLabel("Clickanddragthemouse");
f.add(label,BorderLayout.NORTH);
f.add(tf,BorderLayout.SOUTH);
f.addMouseMotionListener(newMouseMotionAdapter(){//匿名类开场
publicvoidmouseDragged(MouseEvente){
Strings="Mousedragging:x="+e.getX()+"Y="+e.getY();
tf.setText(s);}
});//匿名类完毕
f.setSize(300,200);
f.setVisible(true);
}
publicstaticvoidmain(Stringargs[]){
AnonymousClassobj=newAnonymousClass();
obj.launchFrame();
}
}
publicvoidlaunchFrame(){
《类的继承性》幻灯片本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!本课件PPT仅供大家学习使用学习完请自行删除,谢谢!《类的继承性》幻灯片本课件PPT仅供大家学习使用《类的继承性》教学课件《类的继承性》教学课件《类的继承性》教学课件《类的继承性》教学课件访问控制权限了解
访问控制权限了解第3讲面向对象编程〔高级篇〕第3讲面向对象编程〔高级篇〕面向对象编程〔根底篇〕知识回忆面向对象编程〔根底篇〕知识回忆主要内容3.1继承性3.2多态性3.3抽象类3.4接口3.5内部类和匿名类3.1继承的作用3.2子类对象的创立3.3在子类中访问父类的成员3.4覆盖父类的方法主要内容3.1继承性3.1继承的作用继承Person-name:String-age:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):voidStudent-name:String-age:String-school:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):void+getSchool():String+setSchool(Strings):void为什么引入继承的特性?模仿人类的思维方式—人类的继承性继承Person-name:String+getNamPerson类classPerson{privateStringname;privateintage;publicStringgetName(){returnname;}
publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}}Student类classStudent{privateStringname;privateintage;privateStringschool;publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}publicStringgetSchool{returnschool;}publicvoidsetSchool(Strings){school=s;}}Person类Student类继承为什么引入继承的特性?模仿人类的思维方式—人类的继承性2.程序的代码重用性—少写代码继承为什么引入继承的特性?模仿人类的思维方式—人类的继承性2继承关系格式:class父类{……}class子类extends
父类{……}试验!eXTdEMO1.JAVAeXTdEMO2.JAVA继承关系格式:class父类试验!eXTdEMO1.JAVQQ牧场的设计目的:了解在真实系统中进展设计时如何进展继承层次的设计?QQ牧场的设计目的:了解在真实系统中进展设计时如何进展继承层①找出对象的共同属性和行为这个程序必须能够在任何时候参加新类型的动物。首先要区分出所有动物都有的、抽象的共同特征,然后以这些共同特征设计出能够让所有动物加以扩大的类。考虑:这6种动物有什么共同特点?这些类型有什么相关性?①找出对象的共同属性和行为这个程序必须能够在任何时①找出对象的共同属性和行为5个实例变量: picture:动物JPEG图像的名称 food:此动物所吃的食物(meat/grass) hunger:代表饥饿程度的int值。会根据动物吃了多少食物而改变。 boundaries:代表动物活动范围区域的长宽。 location:动物在活动区域中的位置。4个实例方法:
makeNoise():动物发出声音的行为和程序。 eat():动物遇到食物时的行为程序。 sleep():睡眠的行为程序。 roam():不在进食或睡眠时的行为程序。①找出对象的共同属性和行为5个实例变量:②设计代表共同状态与行为的类Animal-Stringpictual-Stringfood-inthunger-Positionboudaries-PositionlocationvoidmakeNoise()voideat()voidsleep()voidroam()LionCatTiggerHippoDogWolf②设计代表共同状态与行为的类Animal-String③决定子类是否需要让某项行为有特定的不同的运行方式Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggerHippoDogWolf③决定子类是否需要让某项行为有特定的不同的运行方式Anima③决定子类是否需要让某项行为有特定的不同的运行方式Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()③决定子类是否需要让某项行为有特定的不同的运行方式Anima④寻找更多抽象化的时机Animal成员变量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()④寻找更多抽象化的时机Animal成员变量voidm⑤完成类的继承层次Animal。。。。。。。。。。。。LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()Feline……roam()Canine……roam()⑤完成类的继承层次Animal。。。。。。。。。。。。Lio⑤完成类的继承层次④寻找更多抽象化的时机③决定子类是否需要让某项行为有特定的不同的运行方式②设计代表共同状态与行为的类如何进展继承层次的设计--自下而上的设计
①找出对象的共同属性和行为⑤完成类的继承层次④寻找更多抽象化的时机③决定子类是否需要让子类对象调用成员的原那么AnimalmakeNoise()eat()sleep()roam()WolfvoidmakeNoise()voideat()Canine……roam()创建大野狼对象Wolfw=newWolf();调用大野狼的方法w.makeNoise();调用犬科的方法w.roam();调用动物的方法w.sleep()最低阶原那么子类对象调用成员的原那么AnimalmakeNoise()W③添加子类的新成员②改造父类的成员①继承父类的成员父类如何进展子类设计--自上而下的设计
③添加子类的新成员②改造父类的成员①继承父类的成员父类访问控制权限了解
访问控制权限了解③添加子类的新成员②改造父类的成员①继承父类的成员父类如何进展子类设计--自上而下的设计
③添加子类的新成员②改造父类的成员①继承父类的成员父类子类对象的创立一、子类对象的实例化过程二、super的作用子类对象的创立一、子类对象的实例化过程子类的创立一、子类对象的实例化过程classPerson{ publicPerson()父类构造〞);}}classStudent{ publicStudent()子类构造〞);}}子类的创立一、子类对象的实例化过程子类对象的创立一、子类对象的实例化过程publicclassTestDemo11{ publicstaticvoidmain(Stringargs[]){
Studentstu=newStudent(); }}运行结果:
?子类对象的创立一、子类对象的实例化过程运行结果:?子类对象的创立一、子类对象的实例化过程1、先自动调用父类构造函数〔父类中的无参构造函数〕2、然后调用子类构造函数注意:如果父类中有多个构造方法时,如何才能调用父类中某个特定的构造方法呢?其做法是在子类的构造方法中通过super〔…〕来调用父类特定的构造方法。子类对象的创立一、子类对象的实例化过程创立子类二、super()、super(……)classPerson{ privateStringname; privateintage; publicPerson() {调用Person类的无参构造方法〞);} publicPeron(Stringname,intage)调用了Person类的有参构造方法〞); =name; this.age=age;} publicvoidshow() {姓名:〞+name+〞年龄:〞+age);} }创立子类二、super()、super(……)子类对象的创立classStudentextendsPerson{ privateStringdepartment; publicStudent()无参构造〞);} publicStudent(Stringname,intage,Stringdep) {super(name,age); department=dep;我是〞+department+〞的学生〞);有参构造〞);}}子类对象的创立classStudentextendsP子类对象的创立publicclassTestDemo1{ publicstaticvoidmain(Stringargs[]){ Studentstu1=newStudent(); Studentstu2=newStudent(“李四〞,23,〞计算机系〞); stu1.show(); stu2.show(); }}子类对象的创立publicclassTestDemo1{子类对象的创立省略红色字体super(name,age),父类中的构造方法哪个会被调用?子类构造方法中调用父类构造方法的super语句位置有没有限制?如果父类中只定义了有参的构造方法,而子类的构造方法中并没有显式的用super〔〕来调用父类中特定的构造方法,程序此时会有问题吗?找出this和super的一样点和不同点。思考!!!找出继承中构造方法的调用规那么子类对象的创立省略红色字体super(name,age),父成员变量的隐藏和方法的覆写〔1〕当在子类中定义的成员变量和父类中的成员变量同名时,此时称子类的成员变量隐藏了父类的成员变量。改造父类的成员〔2〕当子类中定义了一个方法,并且这个方法的名字,返回类型,参数个数以及类型和父类的某个方法完全一样时,父类的这个方法将被隐藏,这时我们说重写了父类的方法。子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。成员变量的隐藏和方法的覆写〔1〕当在子类中定义的成员变量和父成员变量的隐藏和方法的覆写例如下面的这段程序就是这样的情况:classSuperClass{//父类
inty;
voidsetY(){y=0;}}classSubClassextendsSuperClass{inty;//父类变量y被隐藏
voidsetY(){//重写父类的方法setY()y=1;}}publicTestDemo3{publicstaticvoidmain(Stringargs[]){
SubClassss=newSubClass();
ss.setY();}}成员变量的隐藏和方法的覆写例如下面的这段程序就是这样的情况:
子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。this用来引用当前对象,与this类似,super用来引用当前对象的父类。super的使用可以分为下面三种情况:
1)用来访问父类被隐藏的成员变量,如:
super.y2)用来调用父类中被重写的方法,如:
super.setY()
3)用来调用父类的构造方法,如:
super([paramlist]);成员变量的隐藏和方法的覆写思考:方法的重载与覆写非常类似,找出它们的区别!!!子类在隐藏了父类的成员变量或重写了父类课后讨论讨论二类的继承性与多态性〔1〕主题一:方案设计分析主题三:知识原理掌握—构造方法的重载思考:〔1〕找出父类向子类派生时,构造方法的调用规律〔2〕找出方法的重载与重写的区别课后讨论讨论二类的继承性与多态性〔1〕主题一:方案设计分析写出你所能想到的所有二维、三维形状,并用它们组成一个形状层次构造。层次构造把Shape当作超类,并从中派生出TwoDimensionalShape类和ThreeDimensionalShape类。设计这个层次构造,并定义它的所有类。画出相应的类层次构造图。接下来考虑如果将Shape类变成abstract超类,TwoDimensionalShape类和hreeDimensionalShape类也是abstract类。进展相应的派生后,要求在第三层的类中计算出每个类对应对象的面积和体积。主题一:方案设计分析写出你所能想到的所有二维、三维形状,并用主题三:知识原理掌握—构造方法的重载建立一个人类〔Person〕和学生类〔Student〕,功能要求如下:〔1〕Person中包含4个保护型的数据成员name、addr、sex、age,表示姓名、地址、性别和年龄。用一个4参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,用一个输出方法显示4种属性。〔2〕Student类继承Person类,并增加输出成员math、english存放数学、英语成绩。用一个6参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,另外重写输出方法用于显示6种属性。主题三:知识原理掌握—构造方法的重载建立一个人类〔Perso第3章面向对象高级程序设计3.1继承3.2多态性3.3抽象类和抽象方法3.4接口3.5内部类和匿名类第3章面向对象高级程序设计3.1继承3.2多态性多态(Polymorphism)的意思就是用一样的名字来定义不同的方法。在Java中,普通类型的多态为重载,这就意味着可以使几个不同的方法使用一样的名字,这些方法以参数的个数不同、参数的类型不同等方面来进展区分,以使得编译器能够进展识别。也可以这样讲,重载是同一个方法具有不同的版本,每个版本之间在参数特征方面有差异。重载是Java实现多态性的方式之一。例如:family()方法可以有三个版本,如下:family(){}family(Stringch){address=ch;}family(Stringch,floatn){address=ch;pay=n;}这些方法并存于程序中,编译时,编译器根据实参的类型和个数来区分从而调用那个方法。如果这些方法作为函数或过程同时出现在其它语言的程序中,如C,那将导致灾难性的错误。3.2多态性多态(Polymorphism3.2多态性【例3-6】构造方法重载的例子classperson{Stringname="Johnson";//姓名
intage=45;//年龄
person(){}
person(Stringa){name=a;}
person(Stringa,intb){name=a;age=b;}name+","+"Age="+age);}}publicclassPoly{publicstaticvoidmain(String[]args){personko1=newperson();personko2=newperson("Mike");personko3=newperson("Willian",50);ko1.display();ko2.display();ko3.display();}}3.2多态性【例3-6】构造方法重载的例子3.2多态性在Java语言中,多态性主要表达在两个方面:由方法重载实现的静态多态性〔编译时多态〕和方法重写实现的动态多态性〔运行时多态〕,如下:
1〕编译时多态
在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
2〕运行时多态
由于子类继承了父类所有的属性〔私有的除外〕,所以子类对象可以作为父类对象使用。程序中但凡使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。如果子类重写了父类的方法,那么重写方法的调用原那么如下:Java运行时系统根据调用该方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年云南省职教高考《语文》考前冲刺模拟试题库(附答案)
- 2025年武汉外语外事职业学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 2025年日照职业技术学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 2025年抚顺师范高等专科学校高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年湘教新版九年级历史上册阶段测试试卷含答案
- 2025年外研版七年级科学上册月考试卷
- 2025年外研版三年级起点选择性必修3物理下册阶段测试试卷
- 智能系统内容合同(2篇)
- 2025年浙教版选择性必修1历史下册月考试卷含答案
- 2025年外研版三年级起点必修1历史上册阶段测试试卷
- 成品移动公厕施工方案
- 2025年度部队食堂食材采购与质量追溯服务合同3篇
- 新人教版一年级下册数学教案集体备课
- 绘本 课件教学课件
- 大型央国企信创化与数字化转型规划实施方案
- pcn培训培训课件
- 过错方财产自愿转让协议书(2篇)
- 牧场物语-矿石镇的伙伴们-完全攻略
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理体系 审核与认证机构要求》中文版(机翻)
- 农业生产质量安全风险评估与监控方案
- 人教版六年级上册解方程练习300道及答案
评论
0/150
提交评论