资源预览内容
第1页 / 共65页
第2页 / 共65页
第3页 / 共65页
第4页 / 共65页
第5页 / 共65页
第6页 / 共65页
第7页 / 共65页
第8页 / 共65页
第9页 / 共65页
第10页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第六章面向对象三、类的继承三、类的继承在在 Java Java 中,类是一个层次结构,其中中,类是一个层次结构,其中ObjectObject为为特殊超类或基类,所有的类都直接或间接地继特殊超类或基类,所有的类都直接或间接地继承承ObjectObject类;类;子类继承父类的属性和方法,同时也可以修改父子类继承父类的属性和方法,同时也可以修改父类的属性或重载父类的方法,以及在父类的基类的属性或重载父类的方法,以及在父类的基础上添加新的属性和方法。因此,父类和子类础上添加新的属性和方法。因此,父类和子类之间反映的是之间反映的是“一般与特殊一般与特殊”的关系。的关系。 父类与子类在类的继承中,被继承的类称为父类,继承而来的类则称为子类。有多个子类共同继承一个父类,那么这个父类就是多个类的基类。Java语言只支持单继承,如果要定义多继承,可以使用将要讲解的接口方法。何时选择继承性?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.常犯的错误常犯的错误A有一个有一个B吗吗? 例如让汽例如让汽车轮子成为汽车的子类是错误的车轮子成为汽车的子类是错误的继承的实现定义继承的形式为:定义继承的形式为:访问权限访问权限 class 类名类名 extends 父类父类 类体类体 Java中的继承是通过中的继承是通过extends关键字来关键字来实现的,在定义类时使用实现的,在定义类时使用extends关键字指关键字指明新定义类的父类,就在两个类之间建立了明新定义类的父类,就在两个类之间建立了继承关系。继承关系。新定义的类称为子类,它可以从父类那里新定义的类称为子类,它可以从父类那里继继承所有非承所有非private的属性和方法的属性和方法作为自己的成作为自己的成员。员。继承举例党员类学生类学生党员学生类在职学生脱产学生一个类有多个父类:多继承一个类只有一个父类:单继承任务6-1publicclassStudentStringname;/姓名 intNo;/学号StringInfo()return姓名:+name+学号:+No;public class onJobStudent extends Studentpublicpublic classclass testOnJobStudent publicpublic staticstatic voidvoid main(String args) onJobStudent li=newnew onJobStudent();li.name=李丽;li.No=20080101;System.out.println(li.Info();程序输出:姓名:李丽学号:20080101程序说明:子类自动拥有父类的非私有属性和方法public class StudentString name;/姓名int No;/学号 String Info() return 姓名:+name+学号:+No; 任务6-2public class onJobStudent extends Student String title ;/职称 String company;/所在单位 void printWorkMsg () System.out.println(职称:+title+单位:+company); 子类onJobStudent添加了两个属性和一个方法public class testOnJobStudent public static void main(String args)onJobStudent zhang=new onJobStudent();zhang.name=张三;zhang.No=20081002;zhang.company=广州宝杰公司;zhang.title=工程师;System.out.println(zhang.Info();zhang. printWorkMsg ();任务6-2姓名:张三 学号:20081002职称:工程师 单位:广州宝杰公司Student类类变量:name No方法:String Info()onJobStudent类类变量:name No方法:String Info()变量:company title方法:void printWorkMsg()从父类继承的变量从父类继承的方法任务6-2任务12总结子类自动拥有父类非私有变量子类可以在继承父类后 再添加属于自己的属性和方法课后实训一、 类的多层继承(1)设计一个Point类,包含横坐标x和纵坐标y。(2)设计一个Circle类,继承Point类,并添加int类型的变量radius(半径),求面积方法doublearea()和求周长方法doubleperimeter()。(3)设计一个Cylindar类,继承Circle类,并添加int类型的变量height(高度),求体积方法doublevolumn()。(4)编写测试程序test类,实现下列功能:在main函数中生成两个点p1(3,4)和p2(5,6),生成一个圆c1,圆心在(0,0),半径为3,计算并输出圆c1的面积和周长生成一个圆柱cy1,底面的圆的圆心在(0,0),半径为3,高度为4,计算并输出圆柱cy1的体积备注:每个类都暂时不用构造方法为变量备注:每个类都暂时不用构造方法为变量赋值赋值 直接给属性赋值直接给属性赋值如如 Point p=new Point(); p.x=3; p.y=5;实训提示Point类类xydouble area()()circle类类xyradiusdouble perimeter()()继承继承double area()()cylindar类类xyradiusdouble perimeter()()heightdouble volumn()()在test类的Main函数中生成两个点一个圆一个圆柱public class StudentString name;/姓名int No;/学号String address=广州精英学院;/学校地址 String Info() return 姓名:+name+学号:+No; /子类对父类同名变量的覆盖public class onJobStudent extends Student String company;/工作单位String title; /职称String address=广州工业大道1001号;/ 单位地址void printAddress() System.out.println(单位地址: + address);任务6-3:子类与父类变量同名public class testStudent public static void main(String args) onJobStudent zhang=new onJobStudent();zhang.printAddress();单位地址:广州市工业大道1001号程序输出:任务6-3:子类与父类变量同名public class StudentString name;/姓名int No;/学号 String Info() return 姓名:+name+t学号:+No; public class onJobStudent extends Student String title ;/职称 String company;/所在单位 String Info() return 姓名:+name+t学号:+No + n职称:+title+t单位:+company; 任务6-4:子类与父类方法同名publicclasstestStudentpublicstaticvoidmain(Stringargs)onJobStudentzhang=newonJobStudent();zhang.name=张三;zhang.No=20081002;zhang.company=广州宝杰公司;zhang.title=工程师;System.out.println(zhang.Info();姓名:张三学号:20081002职称:工程师 单位:广州宝杰公司任务6-4:子类与父类方法同名onJobStudent类类nameno继承Student类类namenoaddressaddress/重新定义重新定义任务6-3onJobStudent类类nameno继承Student类类namenoInfo()Info()/重新定义重新定义任务6-4titlecompany任务34总结子类和父类如果拥有相同名称的属性和方法,则先找到自己的使用如果要越级使用父类的属性和方法,应该用super关键字5周课内容结束【任务任务6-5】情景情景1:子类构造方法中显式调用父类:子类构造方法中显式调用父类构造方法构造方法public class Student String name;/姓名 int No;/学号 Student(String aName,int aNo)name=aName;No=aNo;System.out.println(一个学生产生,姓名:+this.name+t学号:+this.No); public class onJobStudent extends Student String title ;/职称 String company;/所在单位 onJobStudent(String aName, int aNo,String aTitle,String aCompany) super(aName, aNo); /显式调用父类构造函数 this.title=aTitle; this.company=aCompany; System.out.println(一个在职学生产生,职称:+this.title+ 单位:+this.company);Super代表父类的构造函数/情景1:子类构造方法中显式调用父类构造方法public class testStudent public static void main(String args) onJobStudent zhang= new onJobStudent(张三,20010909, 工程师,广州宝杰公司);一个学生产生,姓名:张三 学号:20010909一个在职学生产生,职称:工程师 单位:广州宝杰公司程序输出:程序输出:onJobStudent类类namenoonJobStudent(StringaName,intaNo,StringaTitle,StringaCompany)继承Student类类namenoStudent(StringaName,intaNo)【任务任务6-6】情景情景2:子类隐含调用父类不带参数构:子类隐含调用父类不带参数构造方法造方法public class StudentString name;/姓名int No;/学号 Student()System.out.println(一个学生产生);public class onJobStudent extends Student String title ;/职称 String company;/所在单位 onJobStudent() System.out.println(一个在职学生产生);相当于有Student();自动的拥有的【任务任务6-6】情景情景2:子类隐含调用父类不带参数构:子类隐含调用父类不带参数构造方法造方法/情景2:子类隐含调用父类不带参数构造方法publicclasstestStudentpublicstaticvoidmain(Stringargs)onJobStudentli=newonJobStudent();程序输出:程序输出:一个学生产生一个在职学生产生继承Student类类namenoStudent()onJobStudent类类name,noTitle companyonJobStudent()以上两个例子说明,父类的无参数的构造函数,无论子类是否显式调用,它都是存在于子类构造函数中并发挥作用的【任务任务6-7】情景情景3:父类只有带参数构造方法,子父类只有带参数构造方法,子类必须显示调用类必须显示调用class Student String name;/姓名 int No;/学号 Student(String aName,int aNo) name=aName; No=aNo; System.out.println (一个学生产生,姓名:+this.name+t学号:+this.No); public class onJobStudent extends Student String title ;/职称 String company;/所在单位重点容易出错!/情景3:父类只有带参数构造方法,子类必须显示调用publicclasstestStudentpublicstaticvoidmain(Stringargs)onJobStudentli=newonJobStudent();Exception in thread main java.lang.Error: 无法解析的编译问题:构造函数 onJobStudent()不可视at ch6.eg6_7.testStudent.main(testStudent.java:7)继承Student类类namenoStudent(StringaName,intaNo)onJobStudent类类name,noTitle companypublic class StudentString name;/姓名int No;/学号Student() System.out.println(一个学生产生);public class onJobStudent extends Student String title ;/职称 String company;/所在单位【任务任务6-8】情景情景4:子类无构造方法,隐含调用父:子类无构造方法,隐含调用父类无参构造方法类无参构造方法/情景4:子类无构造方法,隐含调用父类无参构造方法publicclasstestStudentpublicstaticvoidmain(Stringargs)onJobStudentli=newonJobStudent();一个学生产生程序输出:程序输出:继承Student类类namenoStudent()onJobStudent类类name,noTitle company12班 6周课内容结束This表示自己本身这个类class TestColor int r,g,b;TestColor(int r,int g,int b) this.r=r; this.g=g; this.b=b;super表示父类public class onJobStudent extends Student String title ;/职称 String company;/所在单位 onJobStudent(String aName, int aNo,String aTitle,String aCompany) super(aName, aNo); /显式调用父类构造函数 this.title=aTitle; this.company=aCompany; System.out.println(一个在职学生产生,职称:+this.title+ 单位:+this.company); publicclassScore/示例:包含两个重载方法的类intcheckOnScore;/平时考勤成绩intmidTermScore;/期中考试成绩intfinalTermScore;/期末考试成绩intdesignScore;/课程设计成绩publicScore(intcheckOnScore,intmidTermScore,intfinalTermScore,intdesignScore)super();this.checkOnScore=checkOnScore;this.midTermScore=midTermScore;this.finalTermScore=finalTermScore;this.designScore=designScore;【任务任务6-9】“静态静态”多态多态计算期末成绩的几种方法计算期末成绩的几种方法/cPower,mPower,fPower分别为平时考勤、期中考试、期末考试成绩比重doublegetResult(doublecPower,doublemPower,doublefPower)returncPower*checkOnScore+mPower*midTermScore+fPower*finalTermScore;/dPower,fPower分别为课程设计、期末考试成绩比重doublegetResult(doubledPower,doublefPower)returndPower*designScore+fPower*finalTermScore;【任务任务6-9】“静态静态”多态多态 publicclassTestScore/演示调用对象的重载方法publicstaticvoidmain(Stringargs)Scores1=newScore(60,70,80,90);/生成一个成绩类对象System.out.println(第一种方法:+s1.getResult(0.5,0.5);System.out.println(第二种方法:+s1.getResult(0.2,0.3,0.5);第一种计算方法:85.0第二种计算方法:73.0【任务任务6-9】“静态静态”多态多态7周上机作业课后二、重载与多态性设计一个雇员类Employee,该雇员类有两种计算工资的方法:第一种:正常工作时间: 80元/天、加班工作时间: 100元/天;第二种:正常工作时间: 100元/天、加班工作时间: 0元/天; 某个月,有个雇员正常工作22天,加班工作6天,请你帮他计算出两种工资的结果,并输出较大的工资。6.2.2 类型转换类型转换类和类之间的类型转换只能用在父类和子类间,不能用在兄弟类,更不能用在根本不相关的两个类之间。类型转换的规则是:子类向父类转换时,属于自动类型转换;而父类要转换成子类时,就必须要使用强制类型转换了。强制类型转换的语法就跟一般基本数据类型转换的语法一样,用小括号运算符配合要转换成的类来做转换的操作。publicclassAnimalStringname;intage;publicclassFishextendsAnimalpublicvoidswim()System.out.println(swim);publicclasstestpublicstaticvoidmain(Stringargs)Animala1=newAnimal();Fishf1=newFish();Fishf2=newFish();/子类到父类的转换:自然转换,显式和隐式都可以a1=(Animal)f1;/显式转换a1=f1;/隐式转换/父类到子类的转换:强制转换,一定要显式转换f2=(Fish)a1;/f2=a1;/语法错误提示;不能从Animal转换成FishpublicclassBirdextendsAnimalpublicvoidfly()System.out.println(fly);/兄弟类不能相互转换 publicclasstest1publicstaticvoidmain(Stringargs)Birdb1=newBird();Fishf1=newFish();Animala1=newAnimal();/直接转换显然不行/b1=(Bird)f1;/错误提示:不能从Fish强制转换为Bird/f1=(Fish)b1;/错误提示:不能从Bird强制转换为Fish/通过父类Animal转换,语法可通过,运行出错!a1=b1;f1=(Fish)a1;Exception in thread main Exception in thread main java.lang.ClassCastExceptionjava.lang.ClassCastException: : ch6.eg6_10.Birdch6.eg6_10.Birdat ch6.eg6_10.test1.main(at ch6.eg6_10.test1.main(test1.java:14test1.java:14) )【任务任务6-11】 “运行时多态运行时多态”StudentFullTimeStudentOnJobStudentStudy()Study()Study()【任务任务6-11】 “运运行时多态行时多态” public class Student String name;/ 姓名姓名int No;/ 学号学号Student(String aName, int aNo) name = aName;No = aNo;void study() public class OnJobStudent extends Student /在职学生在职学生OnJobStudent(String aName, int aNo) super(aName, aNo);void study()System.out.println(this.name+每周末学习每周末学习10个小时,个小时,每个学期学习每个学期学习20周周); publicclassFullTimeStudentextendsStudent/全日制学生publicFullTimeStudent(StringaName,intaNo)super(aName,aNo);voidstudy()System.out.println(this.name+工作日学习20个学时,每个学期学习20周);【任务任务6-11】 “运行时多态运行时多态”任务实现/父类对象指向不同子类对象实现运行时多态publicclasstestpublicstaticvoidmain(Stringargs)Students=newStudent5;s0=newOnJobStudent(jack,001);s1=newOnJobStudent(tom,002);s2=newFullTimeStudent(zhangsan,003);s3=newFullTimeStudent(李四,004);s4=newFullTimeStudent(王五,005);for(inti=0;i5;i+)si.study();jack周末学习10个小时,每个学期学习20周tom周末学习10个小时,每个学期学习20周zhangsan工作日学习20个学时,每个学期学习20周李四工作日学习20个学时,每个学期学习20周王五工作日学习20个学时,每个学期学习20周【任务任务6-11】 “运行时多态运行时多态”可以说圆柱是一个圆吗可以说球是一个圆吗?可以说某个圆是一个球吗?球的对象可以转换为圆柱类对象吗?类值之间的转换类值之间的转换circlecylindarspherearea()area()area()课后问题课后习题2()重载的方法可以通过它们的返回值类型的不同来区分3()同一个类中多个方法具有相同的方法名,不同的输入参数列表称为方法的重载。4为了区分类中重载的同名的不同方法,要求()。 A)采用不同的形式参数列表 B)返回值类型不同 C)调用时用类名或对象名做前缀 D)参数名不同错错对对A7周上机内容三、覆盖与多态(运行时多态)(1)设计一个圆柱体Cylinder类继承Circle类,添加int类型变量height(圆柱体高)并覆盖Cirlce类的求面积doublearea()方法。(2)设计一个球体Sphere类继承Circle类,并覆盖Cirlce类的求面积doublearea()方法。(3)在测试类test的main函数中,生成两个对象,分别为一个圆柱体cy1和一个球sp1,并分别初始化、计算并输出这两个对象的面积。补充(4)在测试类test1的main函数中,生成一个数组,该数组的包含5个对象,前两个为圆柱体对象,后面3个为球类对象,这个数组的每个元素初始化、用一个循环对计算并输出这5个对象的面积。1. Java语言的类间的继承关系是()。A)多重的B)单重的 C)线程的 D)不能继承2. 以下关于Java语言继承的说法正确的是()。A)Java中的类可以有多个直接父类B)抽象类不能有子类C)Java中的接口支持多继承D)最终类可以作为其它类的父类B红色代表还没学暂时不做c3. 下面是有关子类继承父类构造函数的描述,(父类只有带参数 的构造方法时),其中正确的是()。A)如果子类没有定义构造函数,则子类无构造函数B)子类构造函数必须通过super关键字调用父类的构造函数C)子类必须通过this关键字调用父类的构造函数D)子类无法继承父类的构造函数4. 现有两个类A、B,以下描述中表示B继承自A的是()。A)classAextendsBB)classBimplementsAC)classAimplementsBD)classBextendsABD5. 子类可以继承父类的_成员。构造函数也能被继承和重载。6. 如果子类中的某个变量的变量名与它的父类中的某个变量完全一样,则称子类中的这个变量_了父类的同名变量。7. 属性的隐藏是指子类重新定义从父类继承来的_。灰色代表做过了非私有隐藏同名变量或者属性8. 如果子类中的某个方法的名字、返回值类型和_与它的父类中的某个方法完全一样,则称子类中的这个方法覆盖了父类的同名方法。 9. 抽象、封装、_和多态是Java语言的四大特性。10. 在Java语言中,使用_和多态等技术,实现软件重用。参数列表继承封装11. Java仅支持类间的_重继承。12.子类的成员变量能与其父类的成员变量同名吗? 13. 什么是方法覆盖? 14.一个子类可以重新定义从父类那里继承来的同名方法。但是,允许它们有不同类型的返回值吗? 单不能(子类重新定义继承自父类的同名方法,使之实现与父类方法不同的功能;方法覆盖要求子类方法头定义必须与父类方法头定义完全一样。)能15.子类对象如何引用被它隐藏了的父类的属性和调用被它覆盖了的父类的方法? 16.子类的对象能直接向其父类对象赋值吗?反之呢?子类对象一定是父类的对象吗? 17. Java语言中定义接口的关键字是什么?接口的继承应如何实现?接口支持多继承吗Super.xSuper.y();能不能对interface;使用关键字extends实现;支持18.java中,一个子类可以有多个父类吗?可以为一个(父)类定义多个子类吗? 19.保留字this代表什么?不可以,可以代表自己本身这个对象20.下面是一个小程序的主类myprogram的定义,其中A、B是该主类所在源程序中已定义的另两个类的类名,完成程序填空。importjavaawt.*;importjavaapplet.*;publicclassmyprogramextendsApplet/定义小程序的主类Aa;Bb;public_init()a=newA();b=_B();(voidnew)21.下面是一个类的定义,完成程序填空。publicclassYouwriteintx;_()x=0;Youwrite(intx)_;(Youwritethis.x=x;)22.现有类说明如下,请回答问题:publicclassAStringstr1=Hello!t;Stringstr2=Howareyou?;publicStringtoString()returnstr1+str2;问题:1)类A和类B是什么关系?2)类A和类B都定义了str1属性和方法toString(), 这种现象分别称为什么? 3)若a是类A的对象,则a.toString()的返回值是什么?4)若b是类B的对象,则b.toString()的返回值是什么?public class B extends A String str1=bb,Bill.; public String toString( ) return super.str1+str1; (继承关系)(属性的隐藏;方法的覆盖)(Hello!Howareyou?)(Hello,Bill.)23.现有一个类定义如下,请回答问题:classEmployeeStringname;intage;doublewage;staticintNo=0;Employee(Stringa1,inta2,doublea3)name=a1;age=a2;wage=a3;No+;问题:1)e2.name,e2.age,e2.wage的值各是什么?2)生成对象e1、e2后,e1.No值为多少?能否通过类名做前缀引用属性No?在使用该类时在使用该类时,已使用下面语句生成了已使用下面语句生成了该类的对象该类的对象:Employee e1,e2;e1=new Employee(王劲王劲,26,6300);e2=new Employee(张山张山,30,3800);(张山;30;3800.0)(2;能)25-28题为课后作业自己思考 下周讲25.阅读程序,回答问题。publicclassInheritTest1publicstaticvoidmain(Stringargs)Aaa;Bbb;aa=newA();bb=newB();aa.show();bb.show();classAinta=1;doubled=2.0;voidshow()System.out.println(ClassA:+ta=+a+td=+d);问题:1)这是哪一类java程序?2)类A和类B是什么关系? 3)按程序输出的格式写出程序运行后的结果.classBextendsAfloata=3.0f;Stringd=Javaprogram.;intb=4;voidshow()System.out.println(ClassA:+ta=+super.a+td=+super.d);super.show();System.out.println(ClassB:+ta=+a+td=+d+tb=+b);26.现有类说明如下,请回答问题:classAintx=10;intgetA()returnx;classBextendsAintx=100;intgetB()returnx;问题:1)类B是否能继承类A的属性x? 2)若b是类B的对象,则b.getB()的返回值是什么? 3)若b是类B的对象,则b.getA()的返回值是什么? 4)类A和类B都定义了x属性,这种现象称为什么?27.有如下源程序,请回答问题:classAStrings=classA;classBextendsAStrings=classB;publicclassTypeConvertpublicstaticvoidmain(Stringargs)Bb1,b2=newB();Aa1,a2;a1=(A)b2;a2=b2;System.out.println(a1.s);System.out.println(a2.s);b1=(B)a1;System.out.println(b1.s);System.out.println(b2.s);问题:该程序的四行输出各是什么?28.现有类说明如下,请回答问题:publicclassAintx=888;Stringstr=Ilike:;publicStringtoString()returnstr+x;问题:1)类A和类B是什么关系?2)类A和类B都定义了x属性和方法toString(),这种现象分别称为什么? 3)若a是类A的对象,则a.toString()的返回值是什么?4)若b是类B的对象,则b.toString()的返回值是什么?publicclassBextendsAStringx=java;publicStringtoString()returnstr+x+and+super.x;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号