《《继承和多态》PPT课件》由会员分享,可在线阅读,更多相关《《继承和多态》PPT课件(40页珍藏版)》请在金锄头文库上搜索。
1、主讲教师主讲教师:丁月华丁月华Email:ding_9第09章 继承和多态1-2WHPU章节内容n9.1引言引言n父类和子类父类和子类n9.3使用使用super关键字关键字n9.4方法覆盖方法覆盖n9.5覆盖和重载覆盖和重载n9.6对象类对象类object和它的和它的tostring方法方法n9.7多态性、动态绑定和一般程序设计多态性、动态绑定和一般程序设计n9.8对象转换和对象转换和instanceof运算符运算符n9.9数组线性表数组线性表ArrayList类类n自定义栈类自定义栈类n9.11protected数据和方法数据和方法n9.12final类、方法和变量类、方法和变量1-3WHP
2、U9.1 引言n在面向对象中,从已有的类派生出新类,叫做继承。在面向对象中,从已有的类派生出新类,叫做继承。l超类超类=父类父类=基类基类l次类次类=子类子类=扩展类扩展类=派生类派生类nJava中使用关键字中使用关键字extends来实现类的继承。例如:来实现类的继承。例如:classCircleextendsGeometricObject类体;类体;创建了一个创建了一个Circle类,它继承自类,它继承自GeometricObject类。类。n子类继承了父类所有的成员,还可以包含自己的数据子类继承了父类所有的成员,还可以包含自己的数据成员和方法成员成员和方法成员1-4WHPU父类和子类1-
3、5WHPU父类和子类父类GeometricObject publicclassGeometricObjectprivateStringcolor=white;privatebooleanfilled;privatedateCreated;publicGeometricObject()dateCreated=new();publicStringgetColor()returncolor;publicvoidsetColor(Stringcolor)=color;publicbooleanisFilled()returnfilled;publicvoidsetFilled(booleanfille
4、d)=filled;publicgetDateCreated()returndateCreated;publicStringtoString()returncreatedon+dateCreated+ncolor:+color+andfilled:+filled;1-6WHPU父类和子类子类CirclepublicclassCircleextendsGeometricObjectprivatedoubleradius;publicCircle()publicCircle(doubleradius)=radius;publicdoublegetRadius()returnradius;publi
5、cvoidsetRadius(doubleradius)=radius;publicdoublegetArea()returnradius*radius*;publicdoublegetDiameter()return2*radius;publicdoublegetPerimeter()return2*radius*;publicvoidprintCircle()System.out.println(Thecircleiscreated+getDateCreated()+andtheradiusis+radius);1-7WHPU父类和子类 子类RectanglepublicclassRect
6、angleextendsGeometricObjectprivatedoublewidth;privatedoubleheight;publicRectangle()publicRectangle(doublewidth,doubleheight)=width;=height;publicdoublegetWidth()returnwidth;publicvoidsetWidth(doublewidth)=width;publicdoublegetHeight()returnheight;publicvoidsetHeight(doubleheight)=height;publicdouble
7、getArea()returnwidth*height;publicdoublegetPerimeter()return2*(width+height);1-8WHPU9.2 父类和子类TestCircle测试类/:DemonstrateprivatemodifierpublicclassTestCircle/*Mainmethod*/publicstaticvoidmain(Stringargs)CirclemyCircle=newCircle(5.0);System.out.println(Theareaofthecircleofradius+()+is+();/IncreasemyCir
8、clesradiusby10%()*1.1);System.out.println(Theareaofthecircleofradius+()+is+();1-9WHPU9.3 使用super关键字nsuper关键字的功能关键字的功能l调用父类的构造方法:调用父类的构造方法:super();super(参数参数);必须出现在子类构造方法的第一行必须出现在子类构造方法的第一行l调用父类的方法:调用父类的方法:super.方法名(参数);方法名(参数);return2*super.findArea()+(2*getRadius()*)*length;1-10WHPU9.3 使用super关键字n9
9、.3.2构造方法链构造方法链l创建派生类对象时,要首先创建其中包含的基类子对象,创建派生类对象时,要首先创建其中包含的基类子对象,也就是说在派生类的构造方法中,要首先调用基类的构造也就是说在派生类的构造方法中,要首先调用基类的构造方法。方法。l通常,派生类构造方法中的第一条语句都是使用关键字通常,派生类构造方法中的第一条语句都是使用关键字super调用基类的构造方法;如果没有使用关键字调用基类的构造方法;如果没有使用关键字super显式地调用基类的构造方法,则编译器将向派生类构造方显式地调用基类的构造方法,则编译器将向派生类构造方法中添加一条语句法中添加一条语句super(),调用基类默认的构
10、造方法,它调用基类默认的构造方法,它是派生类构造方法的第一条语句。是派生类构造方法的第一条语句。l在任何情况下,构造一个类的实例时,将会沿着继承链调在任何情况下,构造一个类的实例时,将会沿着继承链调用所有基类的构造方法用所有基类的构造方法1-11WHPUpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPer
11、sonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);1-12WHPUTrace ExecutionpublicclassFacultyextendsEmpl
12、oyeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.
13、println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);1. Start from the main methodanimation1-13WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoke
14、d);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);2. Invoke Faculty construc
15、toranimation1-14WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employe
16、esno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);3. Invoke Employees no-arg constructoranimation1-15WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFacult
17、y();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.ou
18、t.println(1)Personsno-argconstructorisinvoked);4. Invoke Employee(String) constructoranimation1-16WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicE
19、mployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);5. Invoke Person() constructoranimation1-17WHPUTrace Execution
20、publicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publi
21、cEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);6. Execute printlnanimation1-18WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argc
22、onstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);7. Execu
23、te printlnanimation1-19WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFaculty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)
24、Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)Personsno-argconstructorisinvoked);8. Execute printlnanimation1-20WHPUTrace ExecutionpublicclassFacultyextendsEmployeepublicstaticvoidmain(Stringargs)newFaculty();publicFac
25、ulty()System.out.println(4)Facultysno-argconstructorisinvoked);classEmployeeextendsPersonpublicEmployee()this(2)InvokeEmployeesoverloadedconstructor);System.out.println(3)Employeesno-argconstructorisinvoked);publicEmployee(Strings)System.out.println(s);classPersonpublicPerson()System.out.println(1)P
26、ersonsno-argconstructorisinvoked);9. Execute printlnanimation1-21WHPU9.4 方法覆盖n当子类当子类从父类中继承方法,子类必须修改父类中定义从父类中继承方法,子类必须修改父类中定义的方法,就叫做方法覆盖(的方法,就叫做方法覆盖(methordoverriding)publicclassCircleextendsGeometricObject/Othermethodsareomitted/*OverridethetoStringmethoddefinedinGeometricObject*/publicStringtoStrin
27、g()return()+nradiusis+radius;1-22WHPU方法重载方法重载方法覆盖方法覆盖在相同的类层次改写已经存在在相同的类层次改写已经存在的方法。的方法。在子类中改写父类中的方在子类中改写父类中的方法法重载方法的形式参数必须不同。重载方法的形式参数必须不同。(类型不同或者个数不同)(类型不同或者个数不同)方法头的形式必须完全相方法头的形式必须完全相同同9.5 覆盖和重载1-23WHPU9.6 对象类Object和它的toString()方法n如果定义一个类时如果定义一个类时,没有指明它的父类没有指明它的父类,则它的父类就是则它的父类就是Object类。类。nObject中几
28、个常用的实例方法:中几个常用的实例方法:lpublicStringtoString()lpublicbooleanequals(Objectobject)(见)(见)lpublicObjectclone()(见)(见)lpublicinthashCode()(见)(见)lpublicClassgetClass()(见)(见)npublicStringtoString()l返回值代表一个该对象的字符串,默认情况下,返回一个由该对象所属返回值代表一个该对象的字符串,默认情况下,返回一个由该对象所属的类名、的类名、和该对象十六进制的散列码组成的字符串和该对象十六进制的散列码组成的字符串l一般而言,每
29、个类继承一般而言,每个类继承toString需要对该函数进行重载,如需要对该函数进行重载,如GeometricObject类中的类中的toString修改如下:修改如下:publicStringtoString()return“color:”+color+“andisfilled:”+filled;1-24WHPU9.7 多态性、动态绑定和一般程序设计n对于需要父类类型的参数,总可以传入子类的实例;实现的对于需要父类类型的参数,总可以传入子类的实例;实现的那一种实现由那一种实现由java虚拟机在运行时动态决定,称为动态绑定虚拟机在运行时动态决定,称为动态绑定或者多态性。或者多态性。n绑定机制如
30、下:假设对象绑定机制如下:假设对象o是类是类c1,c2,.,Cn-1,Cn的实的实力,其中力,其中C1是是C2的子类,的子类,C2是是C3的子类,如果对象的子类,如果对象O调用调用一个方法一个方法p,JVM依次在类依次在类C1,C2,,Cn-1,Cn中查找方中查找方法法P,直到找到为止。一旦找到,停止查找并调用这个第一,直到找到为止。一旦找到,停止查找并调用这个第一次的实现。次的实现。1-25WHPU9.7 多态性、动态绑定和一般程序设计(实例9-5)publicclassPolymorphismDemopublicstaticvoidmain(Stringargs)m(newGraduate
31、Student();m(newStudent();m(newPerson();m(newObject();publicstaticvoidm(Objectx)();classGraduateStudentextendsStudentclassStudentextendsPersonpublicStringtoString()returnStudent;classPersonextendsObjectpublicStringtoString()returnPerson;1-26WHPU9.8 对象转换和instanceof运算符n原则:派生类对象可以复制给基类对象(向上转换)原则:派生类对象可以
32、复制给基类对象(向上转换),基类对象赋值给派生类对象时必须显式转换(向,基类对象赋值给派生类对象时必须显式转换(向下转化)下转化)lObjecto=newStudent()/隐式转换隐式转换lStudentb=o/errorlStudentb=(Student)o;n为了确保转换的安全,好的关是转换前确保该对象为了确保转换的安全,好的关是转换前确保该对象是另一个对象的实例,使用是另一个对象的实例,使用instanceof运算符运算符1-27WHPU9.8 对象转换和instanceof运算符(举例)publicclassTestPolymorphismCastingpublicstaticvo
33、idmain(Stringargs)Objectobject1=newCircle(1);Objectobject2=newRectangle(1,1);displayObject(object1);displayObject(object2);publicstaticvoiddisplayObject(Objectobject)if(objectinstanceofCircle)System.out.println(Thecircleareais+(Circle)object).getArea();System.out.println(Thecirclediameteris+(Circle)
34、object).getDiameter();elseif(objectinstanceofRectangle)System.out.println(Therectangleareais+(Rectangle)object).getArea();1-28WHPU9.9 数组线性表ArrayList类nArrayList:存储不限个数的对象:存储不限个数的对象n9-7例要点:例要点:String是是Object的子类,因此可以加入到的子类,因此可以加入到ArrayList中中1-29WHPU实例实例9-7publicclassTestArrayListpublicstaticvoidmain(St
35、ringargs)cityList=new();cityList.add(London);cityList.add(NewYork);cityList.add(Paris);cityList.add(Toronto);cityList.add(HongKong);cityList.add(Singapore);System.out.println(Listsize?+();System.out.println(IsTorontointhelist?+cityList.contains(Toronto);System.out.println(ThelocationofNewYorkintheli
36、st?+cityList.indexOf(NewYork);System.out.println(Isthelistempty?+();cityList.add(2,Beijing);cityList.remove(Toronto);cityList.remove(1);for(inti=0;i();i+)System.out.print(cityList.get(i)+);();list=new();list.add(newCircle(2);list.add(newCircle(3);System.out.println(Theareaofthecircle?+(Circle)list.g
37、et(0).getArea();1-30WHPU9.10 自定义栈类(自学)publicclassMyStackprivatelist=new();publicbooleanisEmpty()return();publicintgetSize()return();publicObjectpeek()returnlist.get(getSize()-1);publicObjectpop()Objecto=list.get(getSize()-1);list.remove(getSize()-1);returno;publicObjectpush(Objecto)list.add(o);retur
38、no;publicintsearch(Objecto)returnlist.lastIndexOf(o);publicStringtoString()returnstack:+();1-31WHPU9.11 protected数据和方法(重要)nprotectd修饰符:修饰类中的成员。保护的成员或修饰符:修饰类中的成员。保护的成员或方法可以被子类或同一包中的任何类访问,即使子方法可以被子类或同一包中的任何类访问,即使子类在不同包中也可以。类在不同包中也可以。nprivate默认默认protectedpublic,可见性依次增,可见性依次增强强lprivate、protected仅仅用于成员仅仅
39、用于成员lpublic和默认修饰符用于成员,也可用于类。默认修饰符和默认修饰符用于成员,也可用于类。默认修饰符类不能被其他包里的类访问类不能被其他包里的类访问1-32WHPU9.11 protected数据和方法(重要)1-33WHPU1-34WHPU9.12 final类、方法和变量nfinal:说明该类是终极类,不能做父类:说明该类是终极类,不能做父类lMathlStringlStringBuffer1-35WHPU1-36WHPU9.13 对象Object中的方法(自学)nequals方法方法l作用:检验两个Objcct类的派生类对象是否相等。lequals方法在Objcct类中的默认实
40、现如下: public boolean equals(Object obj) return (this=obj); l所以要让equals方法比较两个派生类对象的内容是否相等,必须在派生类中覆盖该方法。1-37WHPU9.13 对象Object中的方法(自学)nhashCode方法方法l返回对象的散列代码。返回对象的散列代码。l对象的散列码是一个整数,用于在散列集合中存储并快速对象的散列码是一个整数,用于在散列集合中存储并快速地查找对象。地查找对象。lObject类中实现的类中实现的hashCode方法,返回对象的十六进制方法,返回对象的十六进制内存地址。内存地址。l一个类中若覆盖了一个类中若
41、覆盖了equals方法,则应该同时覆盖方法,则应该同时覆盖hashCode方法,因为根据约定,如果两个对象的内容相方法,因为根据约定,如果两个对象的内容相等,它们的散列码一定相同。等,它们的散列码一定相同。1-38WHPU9.13 对象Object中的方法nclone方法方法l作用:把一个对象的内容复制给另一个对象。例如:作用:把一个对象的内容复制给另一个对象。例如:newObj=new();l不是所有类的对象都可以被克隆,要成为一个可克隆的对不是所有类的对象都可以被克隆,要成为一个可克隆的对象,它的类必须实现接口。象,它的类必须实现接口。1-39WHPU9.13 对象Object中的方法ngetClass方法方法l一个类在使用时必须先装入。一个类在使用时必须先装入。lJava虚拟机装入类时,创建一个包含类信息的对象,这些虚拟机装入类时,创建一个包含类信息的对象,这些信息有类名、构造方法和方法等。信息有类名、构造方法和方法等。l这个对象是类的一个实例,它描述有关类的信息,称为这个对象是类的一个实例,它描述有关类的信息,称为元对象。l通过元对象,可以在运行时得到类的信息。通过元对象,可以在运行时得到类的信息。l每个对象都可以使用每个对象都可以使用getClass()方法返回它的元对象。方法返回它的元对象。1-40WHPU结束