




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第4章求租客户信息管理,4/30/2020,2,求租客户信息管理,类的继承,对象转型与多态,抽象类与最终类,接口,2,4/30/2020,3,第一讲类的继承,第4章求租客户信息管理,4/30/2020,4,数据描述与数据操作,类,继承的概念、继承的实现、继承的规则,属性,属性的继承、扩展和隐藏,方法,方法的继承、扩展和隐藏构造方法的继承及调用顺序,4/30/2020,5,一、引入什么是继承(inheritance),汽车:型号、排量、颜色卡车:型号、排量、颜色、载重/汽车类classVehicleStringmodel;/汽车型号floatdisplacement;/汽车排量Stringcolor;/汽车颜色/卡车类classTruckStringmodel;/卡车型号floatdisplacement;/卡车排量Stringcolor;/卡车颜色floatcarry;/卡车载重,4/30/2020,6,使用继承代码重用,使用继承描述汽车类和卡车类/汽车类classVehicleStringmodel;floatdisplacement;Stringcolor;/描述卡车类,继承汽车类classTruckextendsVehiclefloatload;/卡车载重,其他三个特性继承汽车类的,可以不要重复定义继承是利用已存在的类定义新的类,可以实现代码的重复使用,提高效率继承是类之间的一种一般和特殊的关系。,思考:现实生活中还有哪些对象之间存在继承关系?,4/30/2020,7,二、类的继承语法规范,Java中被继承的类叫父类(超类、基类),继承一个类产生的新类叫子类(派生类)。创建类时通过extends指明是已有类的子类,类修饰符class子类名extends父类名/类体,定义子类自己的成员变量和成员方法或重写父类的方法,可以来自系统类库,也可以是用户自定义类,4/30/2020,8,Java中类的继承体现,子类继承父类的体现:继承父类的所有成员变量和方法;重写父类的方法;增加自己新的属性和方法。子类是作为另一个类的扩充或修正而定义的一个类,子类总比父类多一些东西。父类有的子类也有父类没有的,子类可以增加父类有的(方法),子类可以改变,4/30/2020,9,类的继承规范,说明:(1)Java不支持多重继承,只支持单继承。每个子类只能有一个父类(2)继承关系可以传递每个子类也可能成为将来某个类的父类直接父类:子类直接继承的类间接父类:两级或两级以上的关系(3)Java中若未明确指定父类,则默认继承java.lang.Object类,4/30/2020,10,Java类层次结构,除了根类,每个类都一个唯一的父类,4/30/2020,11,三、继承的实现父类定义,packagecom.ext;/图形类父类publicclassShapeStringtype;/图形类别publicvoidsetType(Stringtype)this.type=type;publicStringgetType()returntype;/显示类别信息publicvoidshowInfo()System.out.println(type);publicvoidgetArea()/形状的类别未确定,无法计算面积,方法体为空,4/30/2020,12,继承的实现子类定义,packagecom.ext;/圆类子类publicclassCircleextendsShapedoubleradius;/圆的半径publicvoidsetRadius(doubleradius)this.radius=radius;publicdoublegetRadius()returnradius;publicvoidgetArea()showInfo();/直接调用父类的方法System.out.println(“其面积为:”+Math.PI*radius*radius);publicdoublegetPerimeter()return2*Math.PI*radius;,思考:Circle类中有哪些属性和方法?,4/30/2020,13,继承的实现测试类定义,packagecom.ext;/测试类publicTestCirclepublicstaticvoidmain(Stringargs)CirclemyCircle=newCircle();myCircle.setRadius(2.1);/Circle自己新定义的方法myCircle.setType(“这是一个圆!”);/调用继承的父类方法myCircle.getArea();/调用Circle重写的父类的方法doubleperimeter=myCircle.getPerimeter();System.out.println(”其周长为:”+perimeter);,4/30/2020,14,课堂实践,定义图形类的子类:三角形类和矩形类,分别计算其面积及周长。,做一做,4/30/2020,15,四、继承规则,子类继承父类所有的成员和方法。(除了构造方法)父类中private修饰的成员变量不能被子类直接访问。若父类和子类不在同一个包子类继承父类时要求能够找到超类,因此父类必须有package语句,子类必须有import语句,父类还必须有public修饰符,4/30/2020,16,类的继承继承规则图示,包2,子类2,PublicSuperClass,子类1,publicintb;protectedintc;,inta;publicintb;protectedintc;privateintd;,inta;publicintb;protectedintc;,包1,Yes,Yes,Yes,Yes,Yes,no,import,no表示不能直接访问,Yes表示能被继承且能直接访问,4/30/2020,17,五、变量隐藏和方法重写,子类对父类可做扩展和特殊化创建新的成员:变量或方法重新定义父类中已有的变量:变量隐藏重新定义父类中已有的方法:方法重写(覆盖)(overwrite或override),4/30/2020,18,变量隐藏,子类重新定义从父类继承的完全相同的变量称为变量隐藏。变量隐藏后变量的处理当子类执行继承自父类的操作时,处理的是父类的变量当子类执行自己定义的方法时,操作的是自己的变量,把父类的变量“隐藏”起来,classPersonStringid;Stringname;Stringaddress;publicvoidshowName()System.out.println(name);,classStudentextendsPersonStringaddress;/重新定义父类变量publicvoidshowInfo()showName();/调用父类的方法System.out.println(“Student:“+address);/使用的是子类的address,4/30/2020,19,方法的重写(覆盖),重写是子类根据需要重新定义继承自父类的方法,使子类具有自己的行为。子类中的重写的方法应与父类中的被覆盖的方法有完全相同的:方法名称、参数列表、返回值类型。重写时,修改方法的修饰权限只能从小到大privatedefaultprotectedpublic不能重写父类的final方法static:子类可以继承父类的静态方法,但不能重写,classEmployeeStringname;publicvoidshowInfo()System.out.println(name);,classManagerextendsEmployeeStringdepartment;publicvoidshowInfo()System.out.println(name);System.out.println(“Managerof”+department);,4/30/2020,20,示例:隐藏和覆盖,classMyClassprotectedStrings=amemberofMyClass;protectedvoidtest()System.out.println(s);publicclassMySubClassextendsMyClasspublicStrings=“amemberofMySubClass”;/隐藏publicvoidtest()/重写super.test();System.out.println(s);publicstaticvoidmain(Stringargs)MySubClassmsc=newMySubClass();System.out.println(msc.s);msc.test();,amemberofMySubClassamemberofMyClassamemberofMySubClass,4/30/2020,21,思考,方法重载和重写的区别?重载:一个类中,同名方法参数类型不同或个数不等重写:不同类的同名方法,两个类之间是继承关系子类对父类方法的重新定义重写一定是伴随着继承发生的,没有继承就没有重写,4/30/2020,22,六、this和super,系统默认,每个类有null、this和super三个域,直接使用this引用自身对象super引用父类对象this的主要作用是引用自身对象的方法、变量及构造方法。super用来引用父类中的(被覆盖的)方法、(被隐藏的)变量及构造方法。this和super可以调用当前对象或父类对象的构造函数,4/30/2020,23,做一做,理解动物类之间的继承关系,通过Java类的继承体现各种动物之间的关系。编写动物世界的继承关系代码。动物(Animal)包括山羊(Goat)和狼(Wolf),它们吃(eat)的行为不同,山羊吃草,狼吃肉,但走路(walk)的行为是一致的。通过继承实现以上需求,并编写AnimalTest测试类进行测试。,4/30/2020,24,七、构造方法的继承原则,当生成子类对象时,JAVA默认首先去调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象,接下来,再去调用子类的构造方法,生成子类的对象。若父类没有无参的构造方法,则子类必须在自己的构造方法中使用super()显式调用父类的某个有参构造方法。如果子类使用super()显式的调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法,而不会再去寻找父类的不带参数的构造方法。与this()一样,它也必须要作为构造方法的第一条语句。,4/30/2020,25,publicclassAextendsF5privateF1f1=newF1();privateF2f2=newF2();A()System.out.println(A);publicstaticvoidmain(Stringargs)Aa=newA();classF1F1()System.out.println(F1);classF2F2()System.out.println(F2);classF3F3()System.out.println(F3);classF4extendsF3F4()System.out.println(F4);classF5extendsF4F5()System.out.println(F5);,构造方法的调用顺序-面试和资格考试重点,F3F4F5F1F2A,有父类的话先调用父类的构造方法,如果父类之上还有父类,则继续向上调用,直到最顶层父类为止,再一层一层向下调用其它父类的构造方法;当调用完最靠近子类的父类的构造方法时,执行本子类成员对象的构造方法;执行子类的构造方法。,4/30/2020,26,小结,继承可以实现代码复用继承规则变量隐藏方法重写(重载的区别)this和super关键字构造方法的继承和调用顺序,4/30/2020,27,第二讲对象转型与多态,第4章求租客户信息管理,4/30/2020,28,引入:什么是对象转型?,引入:父类Shape,子类Circle,有如下定义:Shapes1=newShape();Circlec1=newCircle();问题:(1)s1=c1;赋值是否合法?(2)c1=s1;赋值是否合法?对象转型:类型之间的相互转换,4/30/2020,29,一、对象转型,父类变量直接引用子类对象(向上转型upcasting)StudentstunewStudent();PersonpnewStudent();/父类引用新创建的子类对象Personp1stu;/父类的引用变量引用子类对象父类引用只能调用父类自己的方法,子类新定义的方法不能访问父类对象赋给子类变量(向下转型downcasting)Students(Student)p1;必须使用强制类型转换必须确保该父类变量目前引用的是子类对象。,4/30/2020,30,示例:对象转型,classSuperClassintx;classSubClassextendsSuperClassinty;charch;publicclassUseSuperSubpublicstaticvoidmain(Stringargs)SuperClasssp,sp_ref;SubClasssb,sb_ref;sp=newSuperClass();sb=newSubClass();sp_ref=sb;/向上转型sb_ref=(SubClass)sp_ref;/向下转型,4/30/2020,31,instanceof运算符应用,可以使用“引用变量instanceof类名”来判断该引用变量所“指向”的对象是否属于该类或该类的子类示例:一个处理网上购书系统,其中有这样三个类:,publicdoublecalculate(Bookbook)if(bookinstanceofComputerBook)/处理计算机类书的打折if(bookinstanceofNovel)/处理小说类书的打折.,publicclassBook/省略细节publicclassComputerBookextendsBook/省略细节publicclassNovelextendsBook/省略细节,在处理程序里有一个方法,接受一个Book类型的对象,计算打折金额。假设两种打折方法不同,而传入的Book对象可能是两种中的任何一种,所以要用instanceof来判断,可以用一个方法处理两种子类。,4/30/2020,32,课堂实践,做一做,定义一个学生类Student,包含属性:学号:no姓名:name方法:类Student带参数的构造方法:在构造方法中通过形参完成对成员变量的赋值操作。重写父类(Object)的equals()方法:根据学号判断对象是否相同,若学号相同,则结果为true,否则结果为false.编写一个测试类StudentTest,创建2个对象,判断他们是否相同.,4/30/2020,33,二、引入:多态polymorphism,/分析下列程序执行过程PublicclassTestpublicstaticvoidmain(Stringargs)Testt=newTest();Animala=newAnimal(“name”);Dogd=newDog(“dogname”,”black”);Catc=newCat(“catname”,”blue”);t.f(a);t.f(d);t.f(c);publicvoidf(Animala)System.out.println(“name:”+);if(ainstanceofDog)Dogdog=(Dog)a;System.out.println(“fur:”+dog.furColor);elseif(ainstanceofCat)Catcat=(Cat)a;System.out.println(“eyes:”+cat.eyesColor);,33,4/30/2020,34,面向对象的核心多态,多态分为静态多态(编译时多态)和动态多态(运行时多态)静态多态:编译时多态通过方法重载实现,本质是用一个方法名来命名一组方法,这一组方法在参数个数、参数类型或次序上有区别,编译时编译程序进行匹配,决定调用哪一个方法。动态多态:运行时多态通过方法重写实现,是执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型调用其相应的方法。,34,4/30/2020,35,多态的使用,运行时多态(动态多态)要满足的条件:子类对象的方法调用必须通过一个基类类型的变量进行调用的方法必须被声明为父类的一个成员调用的方法必须在子类中被重写子类和父类有相同的方法头部子类方法的访问权限不能比基类有更多的限制当使用一个父类变量调用一个方法时,多态会根据存储的对象的类型而不是引用变量的类型来选择要调用的方法。因为父类的变量可以引用任何子类的对象,因此直到程序执行时才知道引用的对象类型。程序可以在运行时自动适应不同类型的数据并进行相应的处理。,35,4/30/2020,36,运行时多态,classAinti,j;A(inti,intj)this.i=i;this.j=j;intadd()returni+j;,classBextendsAB(inti,intj)super(i,j);intmultiply()return0;,classCextendsBC(inti,intj)super(i,j);intmuliply()returni*j;,classInheritancepublicstaticvoidmain(Stringargs)Bx=newC(6,8);System.out.println(“i*j=”+x.mulitply();/通过x调用子类C重重写的mulitply方法System.out.println(“i*j=”+x.add();/调用父类add方法,该方法未被子类重写,i*j=48i+j=14,4/30/2020,37,37,小结动态绑定(多态),多态:不同的对象收到同一个消息可产生完全不同的效果。多态的效果:用户发送一个通用的消息,而实现的细节则由接收对象自行决定。多态的作用:增强了操作的透明性、可理解性和可扩展性;增强了软件的灵活性和重用性。动态多态存在的三个必要条件:要有继承要有方法的重写父类引用指向子类对象,4/30/2020,38,课堂实践,定义类Person及其子类Employee,Employee的子类Manager,每个类定义下列成员变量:Person类:姓名、年龄Employee类:工号、工资Manager类:职务名称每个类定义构造方法初始化所有变量,重写toString()方法输出所有成员变量值。定义测试类PolyTest:创建这些类的对象,调用toString()方法进行测试。,做一做,4/30/2020,39,第三讲抽象类与最终类,第4章求租客户信息管理,4/30/2020,40,一、抽象类和抽象方法,抽象类abstract修饰publicabstractclass抽象类名类体;抽象方法abstract修饰权限修饰符abstract返回值类型方法名(形式参数列表);,定义抽象类的目的:用它作为基类去创建派生类.抽象类的作用是作为一个类族中的共同基类,图书类定义为抽象类,4/30/2020,41,41,示例:抽象方法和抽象类,abstractclassShapepublicabstractvoidgetArea();classRectextendsShapedoublewidth;doubleheight;Rect(doublew,doubleh)width=w;height=h;publicvoidgetArea()System.out.println(TheareaofRectis:+width*height);classCircleextendsShapedoubleradius;finaldoublepi=Math.PI;Circle(doubler)radius=r;publicvoidgetArea()System.out.println(TheareaofCircleis:+pi*radius*radius);,publicclassTestShapestaticvoidshow(Shapes)s.getArea();publicstaticvoidmain(Stringargs)Rectr=newRect(1,2);Circlec=newCircle(2);show(r);show(c);,4/30/2020,42,抽象类的特点,抽象类不能用new创建抽象类的实例(对象)。和具体类一样,类中可以有成员变量和成员方法,包括构造方法。但与具体类不同的是,抽象类中可以定义抽象方法。抽象方法只能出现在抽象类中,但抽象类中可以没有抽象方法。抽象类中的所有抽象方法必须在其非抽象子类中加以实现,否则子类也必须声明为抽象类。抽象方法构造方法不能被声明为抽象方法。静态成员方法不能被声明为抽象方法(abstract和static不能同时存在)。任何包含抽象方法的类必须被声明为抽象类。,4/30/2020,43,二、最终类和最终方法,最终类final修饰不能被继承,即不能声明它的子类。目的:为避免盲目继承。抽象类不能被声明为最终类。它的方法默认是最终方法,但属性可以定义为final和非final。最终方法final修饰不能被它的子类覆盖(它只是说明这个方法已经固定下来,在当前类中和该类的子类中都一样)。最终类中的方法默认也是最终方法。,final称为最终修饰符,可以用来修饰类,方法,属性,变量。,publicfinalclassMathextendsObject/数学类,最终类,4/30/2020,44,抽象类和最终类,抽象类的目的就是为了被继承最终类的目的是不被继承一个类是不能用abstract和final同时修饰的。,4/30/2020,45,小结,对象转型子类引用父类父类引用子类instanceof多态静态多态动态多态抽象类抽象类和抽象方法最终类,4/30/2020,46,第四讲接口,第4章求租客户信息管理,4/30/2020,47,一、Java语言的接口(interface),JAVA只支持单继承,每个类只能有一个超类。接口用于实现多继承,一个类可以实现多个接口,达到多继承的目的。接口定义了若干个抽象方法和常量,形成完成一个特定功能的属性集合。接口是由常量和抽象方法组成的特殊类,接口中的属性都是用final修饰的常量,方法都是用abstract修饰的没有方法体的抽象方法。接口中的方法只提供“做什么”,不提供“怎么做”。,4/30/2020,48,48,接口(interface),接口可用于定义方法原型和常量值。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的一组方法。通过接口可以在运行时动态定位类所需调用的方法。,4/30/2020,49,49,接口的定义,接口(interface)作为特殊形式的抽象类,和类(class)在使用上具有类似的约束。一个public接口只能定义在同名的.java文件中,publicinterfaceinterfaceNameextendsSuperInterfaceList/常量定义和方法定义publicstaticfinal类型变量名=常量值;publicabstractnative返回值类型方法名(参数列表)throws异常列表;.,publicinterfaceMyIfintMAXSIZE=1024;publicabstractvoidmM(Stringname);,4/30/2020,50,50,接口的定义-interface,接口体的定义有两部分:属性的声明、方法的声明系统默认:属性都是publicstaticfinal,成员变量声明后立即赋值。方法都是publicabstract接口具有继承性,通过关键字extends声明该接口是某父类的派生接口;一个接口可以有多个父接口,它们之间用逗号分隔,4/30/2020,51,51,接口的实现-implements,定义类实现接口,用implements关键字说明该类将要实现哪个接口,具体地实现接口中方法所规定的功能修饰符class类名implements,说明:如果某个类实现了接口,这个类就可以访问接口中的常量类在实现方法时必须使用修饰符public如果实现某个接口的类不是abstract的抽象类,则在类的定义部分必须为所有抽象方法定义方法体如果实现某接口的类是abstract的抽象类,则在类的定义部分可以不实现接口的所有方法,4/30/2020,52,52,举例:接口的定义与简单实现,interfaceCalAreadoublepi=3.14;doublecal(doubler);classaimplementsCalAreapublicdoublecal(doubler)returnpi*r*r;,4/30/2020,53,53,课堂实践,定义接口Shape,其中包含方法doublegetPeremeter()求周长,doublegetArea()求面积定义一个矩形类,实现此接口,并自行扩充成员变量和方法,定义一个方法一次直接显示长和宽、周长和面积。定义一个测试类,测试矩形类。,4/30/2020,54,54,多重继承,利用接口可实现多重继承,类可以有父类的同时实现多个接口一个类实现了不止一个接口,为了调用在其它接口中声明的方法,需要使用对应接口类型的变量来存储对象的引用,或将对象的引用进行类型强制转换,转换为它实际的类型。,4/30/2020,55,55,接口和多态,不能生成一个接口类型的对象,但可以生成一个接口类型的引用变量Shapetds=null;接口类型的引用变量可以指向任何实现接口的类的对象,也就意味着可以使用这个变量多态调用在接口中声明的方法Shapes;s=newRectangle(3,4);s.getArea();s=newCircle(3);s.getArea();,4/30/2020,56,56,接口的应用描述,声明多个类必须实现的方法。编程者可以把用于完成特定功能的方法组织成相对独立的集合体接口。凡是需要实现这种特定功能的类,都必须实现这个接口。利用接口模拟多继承。接口在保持单继承优点的前提下,使Java程序的类层次结构更加合理,更符合实际情况。很多不同类型的对象可以共享一组通用的操作定义一组类变量供不同用户使用,4/30/2020,57,57,示例一:接口的定义与实现,interfaceGreetingvoidspeak();voidwrite();classChineseGreetingimplementsGreetingpublicvoidspeak()System.out.println(“您好”);publicvoidwrite()/方法体必须有,可以为空,classAmericanGreetingimplementsGreetingpublicvoi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 历史专业考研试题及答案
- 审计专业原理试题及答案
- 湖南省湖湘名校联盟2025-2026学年高二上学期入学考试语文试卷含答案
- 保卫消防专业试题及答案
- JavaEE轻量级框架Struts2 spring Hibernate整合开发 第4章Struts2高级特性
- 大学专业试题及答案
- 美容店策划活动方案
- 抗疫歌唱活动策划方案
- 家庭聚会致辞材料
- 时尚潮流发布活动指引法
- 2025年海关关务测试题及答案
- (正式版)DB3302∕T 1180-2025 《高速公路建设韧性指标体系》
- 2025年FSC认证原材料采购合同范本
- 2025年8月广东深圳市光明区住房和建设局招聘一般专干5人备考练习题库及答案解析
- 《煤矿安全规程(2025)》防治水新旧条文对照
- GB 16807-2025防火膨胀密封件
- 麻醉医生进修汇报课件
- 开学第一课+课件-2025-2026学年人教版(2024)七年级英语上册
- 医院医疗收费培训课件
- 大咯血的急救和护理
- 名学快问快答题目及答案
评论
0/150
提交评论