第6章类的继承.ppt
《第6章类的继承.ppt》由会员分享,可在线阅读,更多相关《第6章类的继承.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章类的继承 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望6.1 6.1 类的继承类的继承 6.1.1 6.1.1 继承的概念继承的概念 在在面面向向对对象象程程序序设设计计中中,可可以以从从已已有有的的类类派派生生出出新新类类,这这叫叫做做继继承承(inheritanceinheritance)。派派生生出出的的新新类类称称为为已已有有类类的的子子类类。已有类称为父类(超类)。已有类称为父类(超类)。继继承承性性很很好好地地解解决决了了软软件件的的可可重重用
2、用性性问问题题。通通过过继继承承,一一个个类类可可能能拥拥有有已已有有类类的的所所有有功功能能。因因此此,只只须须指指明明新新类类与与现现有有类类的的不不同同,即即增增加加自自己己的的属属性性和和方方法法即即可可。通通过过继继承承,可可以以提提高高软软件件的的开开发发效效率率,增增加加程程序序的的可可维维护护性性,并并且且可可以以利利用用已已有有的的类完成复杂的开发。类完成复杂的开发。JavaJava不不支支持持类类的的多多重重继继承承,JavaJava只只支支持持类类的的单单继继承承,即即每每个子类只能有一个直接父类。个子类只能有一个直接父类。6.1.2 6.1.2 父类和子类父类和子类在在
3、类类声声明明时时通通过过关关键键字字 extendsextends来来声声明明一一个个类类的的子子类类。其其格格式式如下:如下:class class 子类名子类名 extends extends 父类名父类名 implement implement 接口名接口名 /类体类体 说明:说明:在在完完成成上上面面的的定定义义后后,子子类类中中只只能能继继承承父父类类中中访访问问权权限限定定义义为为:publicpublic、protectedprotected、无无修修饰饰符符的的成成员员变变量量和和成成员员方方法法。定义权限为定义权限为privateprivate的成员变量和成员方法不能继承。的
4、成员变量和成员方法不能继承。【例例6.16.1】设设计计一一个个PersonPerson类类,它它包包括括编编号号(nono)和和姓姓名名(namename)两两个个成成员员变变量量。从从PersonPerson类类派派生生出出一一个个StudentStudent类类,增增加班号(加班号(classnameclassname)和成绩(和成绩(scorescore)两个成员变量。两个成员变量。class Personclass Person/成员变量成员变量protected int no;/protected int no;/编号编号 protected String name;/protec
5、ted String name;/姓名姓名 /成员方法略成员方法略 public class Student public class Student extends Personextends Person/成员变量成员变量private String classname;/private String classname;/班号班号private double score;/private double score;/成绩成绩/成员方法略成员方法略(1 1)保存程序:)保存程序:Student.javaStudent.java(2 2)编译程序:编译程序:javac Student.jav
6、ajavac Student.java例题分析:例题分析:子子类类StudentStudent不不但但继继承承了了父父类类PersonPerson的的用用protectedprotected修修饰饰的的成成员员变变量量nono和和namename,还增加了子类自己的成员变量还增加了子类自己的成员变量classnameclassname和和scorescore。【例例6.26.2】编编写写一一个个计计算算几几何何形形状状面面积积的的程程序序,该该几几何何形形状状可可能能是是矩矩形形、圆圆形形或或其其他他的的形形状状。设设计计这这些些类类,并并创创建建一一个个测测试试类类测试它们。测试它们。/*/
7、*ShapeShape类作为父类,它有两个成员变量(名称、面积)和两个成类作为父类,它有两个成员变量(名称、面积)和两个成员方法(构造方法、显示方法)。为了能够实现继承性,这些成员员方法(构造方法、显示方法)。为了能够实现继承性,这些成员都不能是私有的,因此把都不能是私有的,因此把成员变量成员变量作为作为保护类型保护类型(protected)protected),成成员方法员方法作为作为公有类型公有类型(public)public)。*/*/classShape/几何形状几何形状protectedStringname;protecteddoublearea;publicShape()name=
8、不确定的几何形状不确定的几何形状;area=0;public void Display()public void Display()System.out.println(System.out.println(几何形状几何形状:+:+name);name);System.out.println(System.out.println(面积面积:+:+area);area);/*/*当当不不知知道道具具体体的的形形状状时时,不不能能计计算算面面积积。矩矩形形和和圆圆形形都都是是几几何何形形状状,我我们们把把它它作作为为ShapeShape类类的的子子类类,两两个个类类都都在在构构造造方方法法中中初始
9、化自己的成员变量,在成员方法中计算面积。初始化自己的成员变量,在成员方法中计算面积。*/*/classRectangleextendsShape/矩形矩形privatedoublelength,width;publicRectangle(doublelen,doublewid)name=“矩形矩形;/父类父类Shape的成员变量的成员变量protectedStringname;length=len;width=wid;publicvoidArea2()area=length*width;/父类父类Shape的成员变量的成员变量protectedStringareaclassCircleexte
10、ndsShape/圆圆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
11、;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();/思考:输出结果是什么?思考:输出结果是什么?/*/*子子类类
12、的的对对象象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.
13、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类的对象,计算一个具类
14、的对象,计算一个具体的梯形的面积并显示面积?体的梯形的面积并显示面积?编程实践编程实践 习题六习题六 6.5 6.5 题题 设设计计一一个个父父类类BaseBase,再再从从BaseBase派派生生出出工工程程师师类类EngineerEngineer。然然后后,采用一些数据进行测试。采用一些数据进行测试。(1 1)BaseBase类的成员变量有:类的成员变量有:name name:StringString型,代表姓名。型,代表姓名。age age:intint型,代表年龄。型,代表年龄。(2 2)BaseBase类的成员方法有:类的成员方法有:Base()Base():无参数的构造方法。无参数
15、的构造方法。void SetName(String na)void SetName(String na):用用nana对成员变量对成员变量namename进行设置。进行设置。void SetAge(int a):void SetAge(int a):用用a a对成员变量对成员变量ageage进行设置。进行设置。String GetName():String GetName():返回返回namename的值。的值。int GetAge():int GetAge():返回返回ageage的值。的值。(3 3)EngineerEngineer类的成员变量有:类的成员变量有:major:String
16、major:String型,代表专业。型,代表专业。prof:String prof:String型,代表职称。型,代表职称。(4 4)EngineerEngineer类的成员方法有:类的成员方法有:void void SetMajor(String SetMajor(String maj):maj):用用majmaj对对成成员员变变量量majormajor进进行行设设置。置。void SetProf(String pr):void SetProf(String pr):用用prpr对成员变量对成员变量profprof进行设置。进行设置。String GetMajor():String Get
17、Major():返回返回majormajor的值。的值。String GetProf():String GetProf():返回返回profprof的值。的值。(5 5)在)在Engineer2Engineer2的的main()main()中:中:创创 建建 EngineerEngineer类类 的的 对对 象象 engeng,分分 别别 调调 用用 SetName(SetName()、SetAge(SetAge()、SetMajorSetMajor()()、SetProf()SetProf()分别对姓名、年龄、专业、职称进行设置。分别对姓名、年龄、专业、职称进行设置。分分别别调调用用GetN
18、ame(GetName()、GetAge(GetAge()、GetMajor(GetMajor()、GetProf(GetProf(),输出输出engeng的姓名、年龄、专业、职称。的姓名、年龄、专业、职称。看看 Engineer2.java Engineer2.java,启发式教学法,模仿已有的程启发式教学法,模仿已有的程序,引导学生完成需要添加代码的地方。序,引导学生完成需要添加代码的地方。/Engineer2.javaEngineer2.java。启发式教学法。启发式教学法。引导学生编写部分代码引导学生编写部分代码。classBaseprivateStringname;privatein
19、tage;publicBase()publicvoidSetName(Stringna)name=na;/添加添加SetAge(inta)publicStringGetName()returnname;/添加添加GetAge()classEngineerextendsBaseprivateStringmajor,prof;publicvoidSetMajor(Stringmaj)major=maj;/添加添加SetProf(Stringpr)publicStringGetMajor()returnmajor;/添加添加GetProf()publicclassEngineer3publicsta
20、ticvoidmain(Stringargs)Engineereng=newEngineer();eng.SetName(eng.SetName(高山高山););/添加代码,调用添加代码,调用SetAge()SetAge()、SetMajor()SetMajor()、SetProf()SetProf()System.out.println(System.out.println(姓名:姓名:+eng.GetName();eng.GetName();/*/*添添加加代代码码,调调用用GetAge(GetAge()、GetMajor(GetMajor()、GetProf(GetProf(),输出输出
21、engeng的年龄、专业、职称输出的年龄、专业、职称输出*/*/6.5题题完整代码完整代码classBaseprivateStringname;privateintage;publicBase()publicvoidSetName(Stringna)name=na;publicvoidSetAge(inta)age=a;publicStringGetName()returnname;publicintGetAge()returnage;classEngineerextendsBaseprivateStringmajor,prof;publicvoidSetMajor(Stringmaj)maj
22、or=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.
23、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(参数参数););语语句句
24、super(super()调调用用父父类类的的默默认认构构造造方方法法,语语句句super(super(参参数数)调调用用与与参参数数匹匹配配的的父父类类构构造造方方法法。语语句句super(super()和和super(super(参参数数)必必须出现在须出现在子类子类的构造方法的第一条可执行语句的构造方法的第一条可执行语句。2.2.调用父类的成员变量和成员方法调用父类的成员变量和成员方法 当当我我们们在在当当前前操操作作的的子子类类中中想想引引用用父父类类的的一一些些成成员员变变量量或或成成员员方方法法时时,可可以以直直接接使使用用supersuper代代替替父父类类名名称称来来调调用用父
25、父类类的的成成员员变量或成员方法。调用格式为:变量或成员方法。调用格式为:super.super.成员变量名成员变量名或者:或者:super.super.成员方法名(成员方法名()6.1.4 6.1.4 使用关键字使用关键字thisthis thisthis用用来来代代表表当当前前操操作作的的对对象象。当当正正在在操操作作一一个个对对象象时时,我我们们调调用用对对象象方方法法或或成成员员变变量量的的方方式式可可以以为为:对对象象名名.变变量量名名(或或:对对象象名名.方方法法名名(),也也可可以以用用thisthis直直接接代代替替对对象象名名来来使使用用,形式为:形式为:this.this.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承
限制150内