第6章类的继承课件

上传人:痛*** 文档编号:241660833 上传时间:2024-07-14 格式:PPT 页数:87 大小:379.54KB
返回 下载 相关 举报
第6章类的继承课件_第1页
第1页 / 共87页
第6章类的继承课件_第2页
第2页 / 共87页
第6章类的继承课件_第3页
第3页 / 共87页
点击查看更多>>
资源描述
第第6 6章章 类的继承类的继承能力要求能力要求理解继承的概念以及父类和子类的关系理解继承的概念以及父类和子类的关系掌握关键字掌握关键字super和和this的使用的使用理解成员变量的继承,了解成员变量的隐藏理解成员变量的继承,了解成员变量的隐藏掌握成员方法的继承与覆盖掌握成员方法的继承与覆盖理解如何在父类和子类中使用构造方法理解如何在父类和子类中使用构造方法掌握抽象方法的使用掌握抽象方法的使用6.1 6.1 类的继承类的继承 6.1.1 6.1.1 继承的概念继承的概念 在在面面向向对对象象程程序序设设计计中中,可可以以从从已已有有的的类类派派生生出出新新类类,这这叫叫做做继继承承(inheritanceinheritance)。派派生生出出的的新新类类称称为为已已有有类类的的子子类类。已有类称为父类(超类)。已有类称为父类(超类)。继继承承性性很很好好地地解解决决了了软软件件的的可可重重用用性性问问题题。通通过过继继承承,一一个个类类可可能能拥拥有有已已有有类类的的所所有有功功能能。因因此此,只只须须指指明明新新类类与与现现有有类类的的不不同同,即即增增加加自自己己的的属属性性和和方方法法即即可可。通通过过继继承承,可可以以提提高高软软件件的的开开发发效效率率,增增加加程程序序的的可可维维护护性性,并并且且可可以以利利用用已已有有的的类完成复杂的开发。类完成复杂的开发。JavaJava不不支支持持类类的的多多重重继继承承,JavaJava只只支支持持类类的的单单继继承承,即即每每个子类只能有一个直接父类。个子类只能有一个直接父类。6.1.2 6.1.2 父类和子类父类和子类在在类类声声明明时时通通过过关关键键字字 extendsextends来来声声明明一一个个类类的的子子类类。其其格格式式如下:如下:class class 子类名子类名 extends extends 父类名父类名 implement implement 接口名接口名 /类体类体 说明:说明:在在完完成成上上面面的的定定义义后后,子子类类中中只只能能继继承承父父类类中中访访问问权权限限定定义义为为:publicpublic、protectedprotected、无无修修饰饰符符的的成成员员变变量量和和成成员员方方法法。定义权限为定义权限为privateprivate的成员变量和成员方法不能继承。的成员变量和成员方法不能继承。【例例6.16.1】设设计计一一个个PersonPerson类类,它它包包括括编编号号(nono)和和姓姓名名(namename)两两个个成成员员变变量量。从从PersonPerson类类派派生生出出一一个个StudentStudent类类,增增加班号(加班号(classnameclassname)和成绩(和成绩(scorescore)两个成员变量。两个成员变量。class Personclass Person/成员变量成员变量protected protected intint no;/no;/编号编号 protected String name;/protected String name;/姓名姓名 /成员方法略成员方法略 public class Student public class Student extends Personextends Person/成员变量成员变量private String private String classnameclassname;/;/班号班号private double score;/private double score;/成绩成绩/成员方法略成员方法略(1 1)保存程序:)保存程序:Student.javaStudent.java(2 2)编译程序:编译程序:javac javac Student.javaStudent.java例题分析:例题分析:子子类类StudentStudent不不但但继继承承了了父父类类PersonPerson的的用用protectedprotected修修饰饰的的成成员员变变量量nono和和namename,还增加了子类自己的成员变量还增加了子类自己的成员变量classnameclassname和和scorescore。【例例6.26.2】编编写写一一个个计计算算几几何何形形状状面面积积的的程程序序,该该几几何何形形状状可可能能是是矩矩形形、圆圆形形或或其其他他的的形形状状。设设计计这这些些类类,并并创创建建一一个个测测试试类类测试它们。测试它们。/*/*ShapeShape类作为父类,它有两个成员变量(名称、面积)和两个成类作为父类,它有两个成员变量(名称、面积)和两个成员方法(构造方法、显示方法)。为了能够实现继承性,这些成员员方法(构造方法、显示方法)。为了能够实现继承性,这些成员都不能是私有的,因此把都不能是私有的,因此把成员变量成员变量作为作为保护类型保护类型(protected)protected),成成员方法员方法作为作为公有类型公有类型(public)public)。*/*/classShape/几何形状几何形状protectedStringname;protecteddoublearea;publicShape()name=不确定的几何形状不确定的几何形状;area=0;public void Display()public void Display()System.out.System.out.printlnprintln(几何形状几何形状:+:+name);name);System.out.System.out.printlnprintln(面积面积:+:+area);area);/*/*当当不不知知道道具具体体的的形形状状时时,不不能能计计算算面面积积。矩矩形形和和圆圆形形都都是是几几何何形形状状,我我们们把把它它作作为为ShapeShape类类的的子子类类,两两个个类类都都在在构构造造方方法法中中初始化自己的成员变量,在成员方法中计算面积。初始化自己的成员变量,在成员方法中计算面积。*/*/classRectangleextendsShape/矩形矩形privatedoublelength,width;publicRectangle(doublelen,doublewid)name=“矩形矩形;/父类父类Shape的成员变量的成员变量protectedStringname;length=len;width=wid;publicvoidArea2()area=length*width;/父类父类Shape的成员变量的成员变量protectedStringareaclassCircleextendsShape/圆圆privatedoubleradius;publicCircle(doubler)name=“圆圆;radius=r;publicvoidArea2()area=Math.PI*radius*radius;请思考:请思考:怎样定义一个子类怎样定义一个子类“梯形梯形”,并计算梯形的面积。,并计算梯形的面积。“梯形梯形”的父类是的父类是ShapeShape。classTixingextendsShape/梯形梯形privatedoublea,b,h;publicTixing(doublea1,doubleb1,doubleh1)name=梯形梯形;a=a1;b=b1;h=h1;publicvoidArea2()area=(a+b)*h/2;怎样定义一个子类怎样定义一个子类“梯形梯形”,并计算梯形的面积。,并计算梯形的面积。“梯梯形形”的父类是的父类是ShapeShape。publicclassShapeTester3publicstaticvoidmain(Stringargs)Shapes=newShape();Rectanglerec=newRectangle(2.0,3.0);Circlec=newCircle(5.0);s.Display();rec.Area2();rec.Display();/思考:输出结果是什么?思考:输出结果是什么?/*/*子子类类的的对对象象recrec调调用用父父类类ShapeShape的的public public Display(Display()()(因因为为子子类类继继承承了了父父类类的的公公有有成成员员方方法法),namename是是从从父父类类继继承承过过来来的的成成员员变变量量,name=name=矩矩形形,areaarea是是从从父父类类继继承承过过来来的的成成员员变变量量,通通过过前前面面的的rec.Area2(rec.Area2(););计计算算出出areaarea的的值值,area=2.0*3.0=6.0 area=2.0*3.0=6.0 */*/几何形状几何形状:矩形矩形面积面积:6.0:6.0c.Area2();c.Display();运行结果如下运行结果如下:几何形状几何形状:不确定的几何形状不确定的几何形状面积面积:0.0:0.0几何形状几何形状:矩形矩形面积面积:6.0:6.0几何形状几何形状:圆圆面积面积:78.53981633974483:78.53981633974483 Tixingt=newTixing(2,3,4);t.Area2();t.Display();输出:输出:几何形状几何形状:梯形梯形面积面积:10.0:10.0 请思考:请思考:在在ShapeTester3ShapeTester3中,怎中,怎样创建样创建TixingTixing类的对象,计算一个具类的对象,计算一个具体的梯形的面积并显示面积?体的梯形的面积并显示面积?编程实践编程实践 习题六习题六 6.5 6.5 题题 设设计计一一个个父父类类BaseBase,再再从从BaseBase派派生生出出工工程程师师类类EngineerEngineer。然然后后,采用一些数据进行测试。采用一些数据进行测试。(1 1)BaseBase类的成员变量有:类的成员变量有:name name:StringString型,代表姓名。型,代表姓名。age age:intint型,代表年龄。型,代表年龄。(2 2)BaseBase类的成员方法有:类的成员方法有:Base()Base():无参数的构造方法。无参数的构造方法。void void SetNameSetName(String (String nana):用用nana对成员变量对成员变量namename进行设置。进行设置。void void SetAgeSetAge(int int a):a):用用a a对成员变量对成员变量ageage进行设置。进行设置。String String GetNameGetName():():返回返回namename的值。的值。intint GetAgeGetAge():():返回返回ageage的值。的值。(3 3)EngineerEngineer类的成员变量有:类的成员变量有:major:String major:String型,代表专业。型,代表专业。profprof:String:String型,代表职称。型,代表职称。(4 4)EngineerEngineer类的成员方法有:类的成员方法有:void void SetMajorSetMajor(String(String majmaj):):用用majmaj对对成成员员变变量量majormajor进进行行设设置。置。void void SetProfSetProf(String pr):(String pr):用用prpr对成员变量对成员变量profprof进行设置。进行设置。String String GetMajorGetMajor():():返回返回majormajor的值。的值。String String GetProfGetProf():():返回返回profprof的值。的值。(5 5)在)在Engineer2Engineer2的的main()main()中:中:创创 建建 EngineerEngineer类类 的的 对对 象象 engeng,分分 别别 调调 用用 SetNameSetName()、SetAgeSetAge()、SetMajorSetMajor()()、SetProfSetProf()()分别对姓名、年龄、专业、职称进行设置。分别对姓名、年龄、专业、职称进行设置。分分别别调调用用GetNameGetName()、GetAgeGetAge()、GetMajorGetMajor()、GetProfGetProf(),输出输出engeng的姓名、年龄、专业、职称。的姓名、年龄、专业、职称。看看 Engineer2.java Engineer2.java,启发式教学法,模仿已有的程启发式教学法,模仿已有的程序,引导学生完成需要添加代码的地方。序,引导学生完成需要添加代码的地方。/Engineer2.javaEngineer2.java。启发式教学法。启发式教学法。引导学生编写部分代码引导学生编写部分代码。classBaseprivateStringname;privateintage;publicBase()publicvoidSetName(Stringna)name=na;/添加添加SetAge(inta)publicStringGetName()returnname;/添加添加GetAge()classEngineerextendsBaseprivateStringmajor,prof;publicvoidSetMajor(Stringmaj)major=maj;/添加添加SetProf(Stringpr)publicStringGetMajor()returnmajor;/添加添加GetProf()publicclassEngineer3publicstaticvoidmain(Stringargs)Engineereng=newEngineer();eng.eng.SetNameSetName(高山高山););/添加代码,调用添加代码,调用SetAgeSetAge()()、SetMajorSetMajor()()、SetProfSetProf()()System.out.System.out.printlnprintln(姓名:姓名:+eng.eng.GetNameGetName();();/*/*添添加加代代码码,调调用用GetAgeGetAge()、GetMajorGetMajor()、GetProfGetProf(),输出输出engeng的年龄、专业、职称输出的年龄、专业、职称输出*/*/6.5题题完整代码完整代码classBaseprivateStringname;privateintage;publicBase()publicvoidSetName(Stringna)name=na;publicvoidSetAge(inta)age=a;publicStringGetName()returnname;publicintGetAge()returnage;classEngineerextendsBaseprivateStringmajor,prof;publicvoidSetMajor(Stringmaj)major=maj;publicvoidSetProf(Stringpr)prof=pr;publicStringGetMajor()returnmajor;publicStringGetProf()returnprof;publicclassEngineer2publicstaticvoidmain(Stringargs)Engineereng=newEngineer();eng.SetName(高山高山);eng.SetAge(28);eng.SetMajor(计算机软件技术计算机软件技术);eng.SetProf(“工程师工程师”);System.out.println(姓名:姓名:+eng.GetName();System.out.println(年龄:年龄:+eng.GetAge();System.out.println(专业:专业:+eng.GetMajor();System.out.println(职称:职称:+eng.GetProf();6.1.3 6.1.3 使用关键字使用关键字super super supersuper用来代表当前操作的子类的父类。用来代表当前操作的子类的父类。1.1.调用父类的构造方法调用父类的构造方法调用父类的构造方法调用父类的构造方法的语法是:的语法是:super();super();或者:或者:super(super(参数参数););语语句句super(super()调调用用父父类类的的默默认认构构造造方方法法,语语句句super(super(参参数数)调调用用与与参参数数匹匹配配的的父父类类构构造造方方法法。语语句句super(super()和和super(super(参参数数)必必须出现在须出现在子类子类的构造方法的第一条可执行语句的构造方法的第一条可执行语句。2.2.调用父类的成员变量和成员方法调用父类的成员变量和成员方法 当当我我们们在在当当前前操操作作的的子子类类中中想想引引用用父父类类的的一一些些成成员员变变量量或或成成员员方方法法时时,可可以以直直接接使使用用supersuper代代替替父父类类名名称称来来调调用用父父类类的的成成员员变量或成员方法。调用格式为:变量或成员方法。调用格式为:super.super.成员变量名成员变量名或者:或者:super.super.成员方法名(成员方法名()6.1.4 6.1.4 使用关键字使用关键字thisthis thisthis用用来来代代表表当当前前操操作作的的对对象象。当当正正在在操操作作一一个个对对象象时时,我我们们调调用用对对象象方方法法或或成成员员变变量量的的方方式式可可以以为为:对对象象名名.变变量量名名(或或:对对象象名名.方方法法名名(),也也可可以以用用thisthis直直接接代代替替对对象象名名来来使使用用,形式为:形式为:this.this.变量名变量名或者:或者:this.this.方法名(方法名()【例例6.3】this,super举例。举例。classStudentintnumber;Stringname;Student(intnumber,Stringname)/形式参数与成员变量同名形式参数与成员变量同名this.number=number;this.name=name;System.out.println(姓姓 名名:+this.name+,学学 号号:+this.number);如如果果写写成成以以下下形形式式(成成员员变变量量名名与与形形式式参参数数名名不不同同),则不用,则不用thisthis关键字。关键字。Student(intnum,Stringna)number=num;name=na;System;class class UniverUniver_Student extends Student_Student extends Student booleanboolean 婚否婚否;UniverUniver_Student(_Student(intint number,String name,number,String name,boolean boolean b)b)super(number,name);super(number,name);/调用超类调用超类StudentStudent的的Student(number,name),Student(number,name),婚否婚否=b;b;System.out.System.out.printlnprintln(婚否婚否:+:+婚否婚否););public class public class Stu Stu /StuStu.java.java public static void main(String public static void main(String argsargs)UniverUniver_Student _Student zhangzhang=new=new UniverUniver_Student(9902,_Student(9902,牛牛得得草草,false);false);运行结果如下运行结果如下:姓名:牛得草,学号:姓名:牛得草,学号:99029902 婚否婚否:false 6.1.5成员变量成员变量的继承和隐藏的继承和隐藏子子类类在在继继承承其其超超类类(父父类类)时时,可可以以继继承承超超类类中中访访问问权权限限定定义义为为:public、protected、无无修修饰饰符符的的成成员员变变量量。定定义义权权限限为为private的的成成员员变变量量不不能能继继承承。如如果果在在子子类类中中调调用用了了父父类类的的private成员变量,该操作将是非法。成员变量,该操作将是非法。成成员员变变量量的的隐隐藏藏是是指指在在子子类类中中重重新新定定义义了了另另外外一一个个与与其其所所继继承承的的超超类类(或或父父类类)中中同同名名的的成成员员变变量量。这这样样,在在子子类类中中就就有有两两个个同同名名的的成成员员变变量量:一一个个是是继继承承父父类类的的;另另一一个个是是自自己己定定义义的的。当当子子类类执执行行继继承承自自父父类类操操作作时时,处处理理的的是是继继承承自自父父类类的的变变量量。当当子类执行自己的操作时,处理的是自己的变量。子类执行自己的操作时,处理的是自己的变量。【例【例6.4】成员变量的继承和隐藏。成员变量的继承和隐藏。classFatherintage;/父类中的无修饰符的成员变量父类中的无修饰符的成员变量publicFather()age=47;System.out.println(父类的构造方法父类的构造方法);voidDisplay()System.out.println(父亲的年龄是:父亲的年龄是:+age);classSonextendsFatherintage;/子类中与父类同名的成员变量,子类中与父类同名的成员变量,成员变量的隐藏成员变量的隐藏/子类的子类的age和父类的和父类的age占用不同的内存单元占用不同的内存单元publicSon()super();/调用父类的构造方法调用父类的构造方法Father()age=20;/调用的是子类的调用的是子类的age,此处隐藏了父类的此处隐藏了父类的ageSystem.out.println(子类的构造方法子类的构造方法);voidDisplay2()System.out.println(儿子的年龄是:儿子的年龄是:+age)/输出子类的输出子类的agepublicclassTestpublicstaticvoidmain(Stringargs)/创建创建Father类的对象类的对象Fatherfa=newFather();/创建创建Son类的对象类的对象Sons=newSon();/调用父类的调用父类的Display()方法方法fa.Display();/调用子类的调用子类的Display2()方法方法s.Display2();运行结果如下运行结果如下:父类的构造方法父类的构造方法父类的构造方法父类的构造方法子类的构造方法子类的构造方法父亲的年龄是:父亲的年龄是:47儿子的年龄是:儿子的年龄是:206.1.66.1.6 成员方法成员方法的继承与覆盖的继承与覆盖 子子类类可可以以继继承承其其父父类类(超超类类)中中除除privateprivate类类型型以以外外的的所所有有方方法。法。如如果果子子类类觉觉得得从从父父类类继继承承来来的的方方法法的的功功能能不不适适合合于于子子类类,则则可可以以声声明明自自己己的的方方法法。在在声声明明的的时时候候,使使用用相相同同的的方方法法名名及及参参数数表表,但但执执行行不不同同的的功功能能。这这种种情情况况称称为为方方法法覆覆盖盖(method method overridingoverriding)。)。一般在下面几种情况下需要使用方法覆盖:一般在下面几种情况下需要使用方法覆盖:(1 1)子类中实现与父类相同的功能,但采用不同的算法或公式。)子类中实现与父类相同的功能,但采用不同的算法或公式。(2 2)在名字相同的方法中,要做比父类更多的事情。)在名字相同的方法中,要做比父类更多的事情。在在方方法法的的覆覆盖盖中中,由由于于同同名名方方法法隶隶属属于于不不同同的的类类,那那么么,调调用用时时如如何何区区分分它它们们呢呢?只只须须在在方方法法名名前前面面使使用用不不同同的的类类名名或或不不同同类的对象名即可。类的对象名即可。【例例6.56.5】设设计计一一个个PersonPerson类类,它它包包括括编编号号和和姓姓名名的的输输出出,从从它它派派生一个生一个StudentStudent类,增加性别和班级的输出。类,增加性别和班级的输出。class Personclass Person protected protected intint no;/no;/编号编号protected String name;/protected String name;/姓名姓名public Person()public Person()public Person(public Person(intint num,String name1)num,String name1)no=num;no=num;name=name1;name=name1;public void public void displayDatadisplayData()()System.out.System.out.printlnprintln(编号:编号:+no+no+,姓名:姓名:+name);name);/end of Person /end of Personclass Student extends Personclass Student extends Person prprivateivate String sex;/String sex;/性别性别prprivateivate String String classNameclassName;/;/班级班级public Student()public Student()public public Student(Student(intint new_no,String new_no,String new_name,String new_name,String s,s,String c)String c)super(new_no,new_name);super(new_no,new_name);sex=s;sex=s;classNameclassName=c;=c;public void public void displayDatadisplayData()()/子类覆盖了父类的同名方法子类覆盖了父类的同名方法 super.displayData();System.out.System.out.printlnprintln(性性别别:+sex+sex+,班班级级:+classNameclassName););public class public class StuTestStuTest public static void main(String public static void main(String argsargs)String name2=String name2=鱼得水鱼得水;Person Person onePersononePerson=new Person(1,name2);=new Person(1,name2);Student Student oneStudentoneStudent=new=new Student(2,“Student(2,“马马千千里里”,“”,“男男”,“”,“软软件件 02306);02306);/*/*在在方方法法名名前前面面使使用用不不同同类类的的对对象象名名onePersononePerson、oneStudenoneStuden,来来区分同名方法区分同名方法dispDatadispData()()*/*/onePersononePerson.displayDatadisplayData(););/调调用用父父类类的的方方法法displayDatadisplayData()()oneStudentoneStudent.displayDatadisplayData(););/调调用用子子类类的的方方法法displayDatadisplayData()()运行结果如下运行结果如下:编号:编号:1 1,姓名:鱼得水姓名:鱼得水编号:编号:2 2,姓名:马千里姓名:马千里性别:男性别:男 ,班级:软件班级:软件0230602306【例例6.66.6】举举例例:成成员员方方法法的的覆覆盖盖。编编写写一一个个计计算算几几何何形形状状面面积积的的程序,该几何形状可能是矩形或圆形。程序,该几何形状可能是矩形或圆形。class Shape /class Shape /几何形状几何形状 protected String name;protected String name;protected double area;protected double area;public Shape()public Shape()name=name=不确定的几何形状不确定的几何形状;area=0;area=0;public void Display()public void Display()System.out.System.out.printlnprintln(name+(name+,面积面积:+:+area);area);class Rectangle extends Shape /class Rectangle extends Shape /矩形矩形 prprivateivate double length,width;double length,width;public Rectangle(double public Rectangle(double len,doublelen,double widwid)name=name=矩形矩形;length=length=lenlen;width=width=widwid;public void public void computeAreacomputeArea()()area=length*width;area=length*width;public void public void Display()Display()/覆盖覆盖Shape Shape 中的中的Display Display 方法方法 super.Display();/super.Display();/调用调用Shape Shape 的的Display(),Display(),/Shape.Display()/Shape.Display()System.out.printlnSystem.out.println(长长:+:+length);length);System.out.printlnSystem.out.println(宽宽:+:+width);width);class Circle extends Shape/class Circle extends Shape/圆圆 private double r;private double r;public Circle(double r2)public Circle(double r2)name=name=圆圆;r=r2;r=r2;public void public void computeAreacomputeArea()()area=Math.PI*r*r;area=Math.PI*r*r;请思考请思考:请试着在:请试着在CircleCircle类中类中增加一个成员方法增加一个成员方法Display(Display(),在该方法中调用父类的在该方法中调用父类的Display()Display()方法,然后在方法,然后在CircleCircle类的类的Display()Display()中输出圆的半径。中输出圆的半径。class Circle extends Shape/class Circle extends Shape/圆圆 protected double radius;protected double radius;public Circle(double r)public Circle(double r)name=Circle;name=Circle;radius=r;radius=r;public void public void computeAreacomputeArea()()area=Math.PI*radius*radius;area=Math.PI*radius*radius;public void Display()/public void Display()/增加的方法增加的方法 super.Display();super.Display();System.out.System.out.printlnprintln(半径半径:+:+radius);radius);public class public class ShapeTester ShapeTester /ShapeTesterShapeTester.java.java public static void main(String public static void main(String argsargs)Shape s=new Shape();Shape s=new Shape();Rectangle Rectangle recrec=new Rectangle(2.0,3.0);=new Rectangle(2.0,3.0);Circle c=new Circle(4.0);Circle c=new Circle(4.0);puteAreacomputeArea();();puteAreacomputeArea();();rec.Display();rec.Display();rec.display()rec.display()输出输出:矩形,面积矩形,面积:6.0:6.0长长:2.0:2.0宽宽:3.0:3.0 c.Display();c.Display();/圆,面积圆,面积:50.26548245743669:50.26548245743669 s.Display();s.Display();/不确定的几何形状,面积不确定的几何形状,面积:0.0:0.0 运行结果如下运行结果如下:矩形,面积矩形,面积:6.0:6.0长长:2.0:2.0宽宽:3.0:3.0圆,面积圆,面积:50.26548245743669:50.26548245743669不确定的几何形状,面积不确定的几何形状,面积:0.0:0.0 简言之:简言之:应尽量避免覆盖成员变量。应尽量避免覆盖成员变量。如如果果有有需需要要(例例如如:父父类类中中的的方方法法不不适适合合子子类类),则则覆覆盖盖成成员方法。员方法。小结:小结:成员变量、成员方法的覆盖遵循以下的原则:成员变量、成员方法的覆盖遵循以下的原则:(1 1)有有时时父父类类的的方方法法和和变变量量不不一一定定适适合合子子类类,在在这这种种情情况况下下,子子类可以对这些变量和方法进行重新定义,即覆盖原来的定义。类可以对这些变量和方法进行重新定义,即覆盖原来的定义。(2 2)成员变量和成员方法的覆盖:)成员变量和成员方法的覆盖:如果在子类中重新定义了一个与它的父类完全相同的一个变量如果在子类中重新定义了一个与它的父类完全相同的一个变量(或或方方法法),子子类类的的变变量量(或或方方法法)将将覆覆盖盖超超类类中中的的同同名名变变量量(或或方方法法)。此此时时,父父类类中中该该变变量量(或或方方法法)仍仍可可在在子子类类中中使使用用,但要加上关键字但要加上关键字supersuper和圆点操作符。例如和圆点操作符。例如:super.display();super.display();(3 3)通通常常的的规规则则是是覆覆盖盖成成员员方方法法比比重重载载方方法法更更普普遍遍,但但是是应应尽尽量避免覆盖成员变量。量避免覆盖成员变量。(4 4)如如果果一一个个父父类类中中的的方方法法不不适适合合子子类类,可可以以在在子子类类中中使使用用与与父父类类中中一一样的的方方法法头部部进行行覆覆盖盖。如如果果继承承过来来的的方方法法还能能使使用用,可以通可以通过使用使用supersuper关关键字避免代字避免代码重复。重复。(5 5)如如果果重重定定义义的的方方法法的的参参数数列列表表与与父父类类中中该该方方法法的的列列表表不不一一致,那么应该在父类中重载,而不是在子类中覆盖。致,那么应该在父类中重载,而不是在子类中覆盖。(6 6)尽量避免覆盖成员变量,它会使代码难于理解。)尽量避免覆盖成员变量,它会使代码难于理解。覆覆盖盖一一个个类类的的基基本本功功能能可可能能会会造造成成一一些些问问题题,所所以以在在覆覆盖盖前前一一定定要了解所有继承来的方法。要了解所有继承来的方法。6.1.7 6.1.7 有继承时的构造方法有继承时的构造方法 子子类类可可以以继继承承父父类类的的构构造造方方法法,构构造造方方法法的的继继承承遵遵循循以以下下的的原原则:则:(1 1)子类无条件地继承父类的不含参数的构造方法。)子类无条件地继承父类的不含参数的构造方法。(2 2)如如果果子子类类自自己己没没有有构构造造方方法法,则则它它继继承承父父类类的的无无参参数数构构造方法作为自己的构造方法;造方法作为自己的构造方法;(3 3)如如果果子子类类自自己己定定义义了了构构造造方方法法,则则在在创创建建新新对对象象时时,它它将将先先执执行行继继承承自自父父类类的的无无参参数数构构造造方方法法,然然后后再再执执行行子子类类自自己己的的构造方法。构造方法。(4 4)对对于于父父类类的的含含参参数数构构造造方方法法,子子类类可可以以通通过过在在自自己己的的构构造造方方法法中中使使用用supersuper关关键键字字来来调调用用它它,但但这这个个调调用用语语句句必必须须是是子子类类构构造方法的第一个可执行语句。造方法的第一个可执行语句。【例例6.76.7】举例:构造方法的继承。】举例:构造方法的继承。classParentParent()/无参数的构造方法无参数的构造方法System.out.println(Parent1);Parent(inti)/带参数的构造方法带参数的构造方法System.out.println(Parent2);publicclassChildextendsParent/Child.javaChild()/子类的构造方法子类的构造方法/super();System.out.println(Child1);Child(inti)/子类的构造方法子类的构造方法/super();System.out.println(Child2);Child(intx,inty)/子类的构造方法子类的构造方法super(x);/Parent(x)System.out.println(Child3);publicstaticvoidmain(Stringargs)/Childchild11=newChild();/原原则则(2),Parent1/*先先将将Child(),Child(inti),Child(intx,inty)方方法法作作为为注注释释,然然后后运运行行Childchild11=newChild();。*/Childchild12=newChild();/原则(原则(3),Parent(),Child()/*Parent1Child1*/Childchild2=newChild(2);/原则(原则(3),Parent(),Child(2)/*Parent1Child2*/Childchild3=newChild(6,7);/原则(原则(4),Child(6,7)/*Parent2Child3*/运行结果如下运行结果如下:Parent1Child1Parent1Child2Parent2Child3编程技巧:编程技巧:避避免免隐隐蔽蔽地地调调用用超超类类的的构构造造方方法法,可可使使用用下下面面的的两两种种解解决决方方法。法。(1 1)每每个个子子类类的的构构造造方方法法都都应应当当明明确确地地调调用用父父类类的的一一个个构构造造方方法法,而且必须在第一行调用。而且必须在第一行调用。(2 2)为每每个个可可能能成成为父父类的的类提提供供一一个个无无参参数数构构造造方方法法,如如果果还有其他需要,有其他需要,则重重载构造方法,提供构造方法,提供带参数的构造方法。参数的构造方法。6.2 final6.2 final类类有有时时可可能能不不希希望望类类被被扩扩展展,在在这这种种情情况况下下,用用finalfinal修修饰饰符符说说明明一一个类是终极的个类是终极的(final)final),不能做父类。不能做父类。finalfinal类类是是终终极极类类,即即不不能能被被继继承承的的类类。它它不不能能够够产产生生子子类类,只只能能直接使用。直接使用。例如,例如,JavaJava中的中的MathMath类、类、StringString类都是终极类类都是终极类。finalfinal类的最大优点是:类的最大优点是:(1 1)可可以以提提高高系系统统安安全全性性。黑黑客客常常用用的的一一种种技技术术是是设设计计一一个个子子类类,然然后后用用它它替替换换原原来来的的父父类类以以达达到到盗盗取取或或破破坏坏他他人人信信息息的的目目的的。最最终类可以避免该种情况的发生。终类可以避免该种情况的发生。(2 2)在在编编程程过过程程中中,程程序序员员可可以以把把一一个个编编写写的的无无懈懈可可击击的的类类声声明明为最终类,防止其他人通过继承改动程序等等为最终类,防止其他人通过继承改动程序等等。【例【例6.86.8】最终类举例。最终类举例。public public finalfinal class class FinalExFinalEx public static void main(String a)public static void main(String a)/代码略代码略 6.3抽象类和抽象方法抽象类和抽象方法1.1.抽象类(抽象类(abstract classabstract class)abstractabstract修修饰符符用用于于定定义抽抽象象类。抽抽象象类是是不不能能被被实例例化化的的类,即即这种种类不不能能直直接接产生生对象象,使使用用这种种类的的唯唯一一方方式式是是用用它它产生子生子类,然后用其子,然后用其子类来来产生生对象达到使用的目的。象达到使用的目的。JavaJava规规定定:抽抽象象类类不不一一定定含含有有抽抽象象方方法法,但但有有抽抽象象方方法法的的类类一一定是抽象类。定是抽象类。抽抽象象类中中的的抽抽象象方方法法不不需需要要写写具具体体实现(在在子子类中中必必须重重写写该方方法法且且给出出具具体体实现,这一一点点与与接接口口相相同同);抽抽象象类中中的的非非抽抽象方法可以写具体象方法可以写具体实现也可不写。也可不写。2.抽象方法(抽象方法(abstractmethod)抽抽象象类类中中一一般般定定义义一一些些在在本本类类中中不不能能实实现现的的方方法法(抽抽象象方方法法),抽抽象象方方法法没没有有方方法法体体,主主要要作作用用是是可可以以定定义义一一个个统统一一的的编编程程接接口口,在在子子类类中中产产生生多多态态(同同名名方方法法在在不不同同的的子子类类中中具具有有不不同同的的实实现现)。抽抽象象类类中中可可以以没没有有抽抽象象方方法法,但但有有抽抽象象方方法法的的类类一一定定是抽象类,否则定义将会出错。是抽象类,否则定义将会出错。在在前前面面的的内内容容中中我我们们讲讲过过,抽抽象象的的类类不不能能直直接接产产生生对对象象,只能通过继承来使用。只能通过继承来使用。【例例6.9】抽象类和抽象方法举例。求多种规则图形的面积。】抽象类和抽象方法举例。求多种规则图形的面积。abstractabstract class Graph /class Graph /图形图形 public public abstractabstract double double Area();Area();/抽象方法抽象方法AreaArea public void public void printArea printArea()()System.out.System.out.printlnprintln(面积是:面积是:+Area();Area();class Circle extends Graph /class Circle extends Graph /圆形圆形 private double r;private double r;public Circle(double r2)public Circle(double r2)r=r2;r=r2;public double public double Area()Area()return 3.14159*r*r;return 3.14159*r*r;classclass Tixing Tixing extends Graph /extends Graph /梯形梯形 private double a,b,h;private double a,b,h;public public Tixing Tixing(double A,double B,double H)(double A,double B,double H)a=A;a=A;b=B;b=B;h=H;h=H;public double public double Area()Area()return(a+b)*h/2;return(a+b)*h/2;public class public class AreaTest AreaTest /文件名:文件名:AreaTestAreaTest.java.java public static void main(String public static void main(String argsargs)Circle c1=new Circle(3);Circle c1=new Circle(3);Tixing Tixing v1=new v1=new TixingTixing(2,3,4);(2,3,4);c1.c1.printAreaprintArea();();v1.v1.printAreaprintArea();();运行结果如下运行结果如下:面积是:面积是:28.274309999999996 28.274309999999996面面积是:是:10.0 10.0 例例题分析:分析:父父类Graph(Graph(图形形)是是一一个个抽抽象象类,因因为图形形不不同同,计算算面面积的的公公式式也也不不同同,所所以以在在父父类Graph(Graph(图形形)中中定定义了了一一个个抽抽象象方方法法Area(Area()。在在子子类CircleCircle(圆形形)、TixingTixing(梯梯形形)中中实现计算算具具体体图形形的面的面积的功能的功能 编程实战编程实战习题六习题六6.8题题(参考:例(参考:例6.9)6.8定定义义一一个个动动物物AnimalAn
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!