子类与继承

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第6章子类与继承2010-8-12主要内容•子类与父类•子类的继承性•成员变量的隐藏和方法重写•super关键字•final关键字•对象的上转型对象•继承与多态•abstract类与abstract方法•面向抽象编程•开-闭原则真核生物是其细胞具有细胞核的单细胞生物和多细胞生物的总称,它包括所有动物、植物、真菌和其他具有由膜包裹着的复杂亚细胞结构的生物。把真核生物分为三界:植物界动物界真菌界动物是多细胞真核生命体中的一大类群,称之为动物界。动物身体的基本形态会在它们发育时变得固定,通常是早在其胚胎发育时,但也有些会在其稍后的生命中有个变态的过程。大多数动物是能动的-它们能自发且独立地移动。绝大多数动物是消费者-它们依靠其他生命体(如植物)作为其食粮。但也有少部分动物属于分解者——以已经死亡的生物体(有机质)作为食粮(例如蚯蚓)。亚里斯多德将生物区分成植物(通常是不移动的)和动物(时常会移动去获取食物)两种。在林奈系统里,则被分为了植物界和动物界两界。当使用植物界此一特定的分类时,通常会是指三种概念的其中一种。由小至大,这三个类群为:有胚植物、绿色植物、泛植物•§6.1子类与父类利用继承,可以先编写一个共有属性的一般类,根据该一般类再编写具有特殊属性的新类,新类继承一般类的状态和行为(成员变量与方法),并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。声明一个类的子类的格式如下:class子类名extends父类名{…}classStudentextendsPeople{………}Student类声明为People类的子类,People是student的父类,如果没有extends,系统默认继承Object(java.lang.Object)2010-8-18•§6.2子类的继承性子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作。子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。9▫§6.2.1子类和父类在同一包中的继承性如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。例1▫§6.2.2子类和父类不在同一包中的继承性如果子类和父类不在同一个包中,那么,子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法,继承的成员或方法的访问权限保持不变。何时使用protected:1,允许不同包中的子类继承其成员变量和方法。2,禁止不同包中的类访问其成员变量和方法何时使用友好的:1,禁止不同包中的子类继承其成员变量和方法2,禁止不同包中的类访问其成员变量和方法(增)使用protected和友好型的区别权限访问性继承性位置关键字类内部同包类外部不同包类外部同包子类不同包子类PublicProtectedFriendlyPrivate权限访问性继承性位置关键字类内部同包类外部不同包类外部同包子类不同包子类Public√√√√√Protected√√X√√Friendly√√X√XPrivate√XXXX2010-8-114▫§6.2.3继承关系(Generalization)的UML图如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。•§6.3成员变量的隐藏和方法重写•§6.3.1成员变量的隐藏对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。子类对象任然可以调用从父类继承的方法操作隐藏的成员变量。(增)例子:成员变量的隐藏2010-8-116▫§6.3.2方法重写(Override)子类通过重写可以隐藏已继承的实例方法。1.重写的语法规则•如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。•方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。例22010-8-117▫§6.3.2方法重写(Override)2.重写的目的•子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。重写方法(包括新声明的方法)•可以操作:•继承的成员变量和方法;•新声明的成员变量和方法;•无法直接操作:•被隐藏的成员变量和方法;•但可以使用super关键字操作隐藏的变量和方法(第四节)例3,情况1如果将子类改为:doublecomputer(floatx,floaty){……}情况2如果将父类改为:doublecomputer(floatx,floaty){……}情况3如果将子类改为:floatcomputer(floatx,floaty,doublez){……}情况4如果将父类改为:protectedfloatcomputer(floatx,floaty,doublez){……}2010-8-119•§6.4super关键字子类可以隐藏从父类继承的成员变量和方法,如果在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。2010-8-120▫§6.4.1使用super操作被隐藏的成员变量和方法在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。比如super.x、super.play()就是访问和调用被子类隐藏的成员变量x和方法play()。例4▫§6.4.2使用super调用父类的构造方法•子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。•例5•场景1省略univerStudent的super结果?如果子类的构造方法没有super关键字,super();是默认加载到子类的构造方法中;场景2如果再省略Student中的student()结果?如果一个类中有一个或多个构造方法,默认构造方法会取消,如果此类需要作为父类,应该包括一个不带参数的构造方法,防止子类省略super出现错误▫§6.4.2使用super调用父类的构造方法2010-8-123•§6.5final关键字final关键字可以修饰类、成员变量和方法中的局部变量。2010-8-124▫§6.5.1final类可以使用final将类声明为final类。final类不能被继承,即不能有子类。如:finalclassA{…}2010-8-125▫§6.5.2final方法如果用final修饰父类中的一个方法,那么这个方法不允许子类重写。2010-8-126▫§6.5.3常量如果成员变量或局部变量被修饰为final的,就是常量。•常量在运行期间不允许发生变化。•常量在声明时没有默认值,需要程序声明时指定该常量的值例62010-8-127•§6.6对象的上转型对象老虎是哺乳动物,哺乳类是老虎类的父类,只强调了哺乳类的特点,弱化了老虎本身的属性。2010-8-128•§6.6对象的上转型对象假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如:Aa;a=newB();或Aa;Bb=newB();a=b;这时,称对象a是对象b的上转型对象。例7•上转型对象不能操作子类新增的成员变量和方法•上转型对象可以操作继承的变量和方法,隐藏的变量,重写的方法.•上转型对象不能调用子类重写的静态方法,只能调用父类静态方法•注意:•父类对象不等于子类对象的上转型对象(主要区别在于重写方法能否调用)•上转型对象可以强制转化为子类对象,该子类对象又具备了子类的所有属性和功能•不可以将父类创建的对象引用赋值给子类声明的对象People类人猿是人=new类人猿();2010-8-131•§6.7继承与多态哺乳动物的叫声很多种,如汪~喵~多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。思考使用UML完成设计例82010-8-132•§6.8abstract类和abstract()方法用关键字abstract修饰的类称为abstract类(抽象类)。如:abstractclassA{…}用关键字abstract修饰的方法称为abstract方法(抽象方法),例如:abstractintmin(intx,inty);注意:1.abstract类中可以有abstract方法abstractclassA{abstractintmin(intx,inty);intmax(intx,inty){……}}2.abstract类不能用new运算创建对象子类必须重写抽象父类的抽象方法给出方法体3.因为final不能重写,但是又因为“2”所以final和abstract不能同时修饰方法或类4.Abstract类可以没有abstract()方法;5.如果一个abstract类是abstract类的子类,他可以重写父类的abstract方法,也可以继承这个abstract()方法;例92010-8-135•§6.9面向抽象编程在设计一个程序时,可以通过在abstract类中声明若干个abstract方法,表明这些方法在整个系统设计中的重要性,方法体的内容细节由它的非abstract子类去完成。使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法。所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。publicclassCircleextendsGeometry{doubler;Circle(doubler){this.r=r;}publicdoublegetArea(){return(3.14*r*r);}}publicclassPillar{Circlebottom;//bottom是抽象类Geometry声明的变量doubleheight;Pillar(Geometrybottom,doubleheight){this.bottom=bottom;this.height=height;}publicdoublegetVolume(){returnbottom.getArea()*height;//bottom可以调用子类重写的getArea方法}}如果柱体的底部不是圆型,如何修改1,增加所有类型的底部成员变量,增加不同类型的求体积方法。2,优雅地使用面向抽象的编程,使的Pillar的底部不会依赖于某个具体的类,而是随需要进行改变而不用对pillar进行任何改变。例子102010-8-139•§6.10开-闭原则所谓“开-闭原则”(Open-ClosedPrinciple)就是让设计的系统应当对扩展开放,对修改关闭。(无需对pillar类进行改变就可以扩展其功能)在设计系统时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为对扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当是对修改关闭的,即不能因为用户的需求变化而再发生变化,因为这部分不是用来应对需求变化的。如果系统的设计遵守了“开-闭原则”,那么这个系统一定是易维护的,因为在系统中增加新的模块时,不必去修改系统中的核心模块。•结合6.9说明开-闭原则

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功