




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 面向对象,三、类的继承,在 Java 中,类是一个层次结构,其中Object为特殊超类或基类,所有的类都直接或间接地继承Object类; 子类继承父类的属性和方法,同时也可以修改父类的属性或重载父类的方法,以及在父类的基础上添加新的属性和方法。因此,父类和子类之间反映的是“一般与特殊”的关系。,父类与子类,在类的继承中,被继承的类称为父类,继承而来的类则称为子类。有多个子类共同继承一个父类,那么这个父类就是多个类的基类。 Java语言只支持单继承,如果要定义多继承,可以使用将要讲解的接口方法。,何时选择继承性?,一个很好的经验: “B是一个A吗?” 如果是则让B做A的子类.,常犯的错误A有一个B吗? 例如让汽车轮子成为汽车的子类是错误的,继承的实现,定义继承的形式为: 访问权限 class 类名 extends 父类 类体 Java中的继承是通过extends关键字来实现的,在定义类时使用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系。 新定义的类称为子类,它可以从父类那里继承所有非private的属性和方法作为自己的成员。,继承举例,一个类有多个父类:多继承,一个类只有一个父类:单继承,任务6-1,public class Student String name;/姓名 int No;/学号 String Info() return “姓名:“+name+“学号:“+No; ,public class onJobStudent extends Student ,public class testOnJobStudent public static void main(String args) onJobStudent li=new onJobStudent(); =“李丽“; li.No=20080101; System.out.println(li.Info(); ,程序输出: 姓名:李丽 学号:20080101,程序说明:子类自动拥有父类的非私有属性和方法,public class Student String name;/姓名 int No;/学号 String Info() return “姓名:“+name+“ 学号:“+No; ,任务6-2,public 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.No=20081002; pany=“广州宝杰公司“; zhang.title=“工程师“; System.out.println(zhang.Info(); zhang. printWorkMsg (); ,任务6-2,姓名:张三 学号:20081002 职称:工程师 单位:广州宝杰公司,任务6-2,任务1 2 总结,子类自动拥有父类非私有变量 子类可以在继承父类后 再添加属于自己的属性和方法,1有A类、B类和测试类testAB分别如下定义: public class A A() System.out.println(“a“); public class B extends A public class testAB public static void main(String args) B b1=new B(); 请问testAB类的输出是什么?这说明什么问题?,课后习题,课后实训,一、 类的多层继承 (1)设计一个Point类,包含横坐标x和纵坐标y。 (2)设计一个Circle类,继承Point类,并添加int类型的变量radius(半径),求面积方法double area()和求周长方法double perimeter()。 (3)设计一个Cylindar类,继承Circle类,并添加int类型的变量height(高度),求体积方法double volumn()。 (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;,实训提示,继承,继承,在test类的Main函数中 生成两个点 一个圆 一个圆柱,public class Student String 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 Student String 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:子类与父类方法同名,public class testStudent public static void main(String args) onJobStudent zhang=new onJobStudent(); =“张三“; zhang.No=20081002; pany=“广州宝杰公司“; zhang.title=“工程师“; System.out.println(zhang.Info(); ,姓名:张三 学号:20081002 职称:工程师 单位:广州宝杰公司,任务6-4:子类与父类方法同名,任务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(“一个学生产生,姓名:“++“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; pany=aCompany; System.out.println(“一个在职学生产生,职称:“+this.title+“ 单位:“+pany); ,Super代表父类的构造函数,/情景1:子类构造方法中显式调用父类构造方法 public class testStudent public static void main(String args) onJobStudent zhang= new onJobStudent(“张三“,20010909, “工程师“,“广州宝杰公司“); ,一个学生产生,姓名:张三 学号:20010909 一个在职学生产生,职称:工程师 单位:广州宝杰公司,程序输出:,onJobStudent(String aName, int aNo, String aTitle,String aCompany),【任务6-6】情景2:子类隐含调用父类不带参数构造方法,public class Student String 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:子类隐含调用父类不带参数构造方法 public class testStudent public static void main(String args) onJobStudent li=new onJobStudent(); ,程序输出:,一个学生产生 一个在职学生产生,以上两个例子说明,父类的无参数的构造函数,无论子类是否显式调用,它都是存在于子类构造函数中并发挥作用的,【任务6-7】情景3:父类只有带参数构造方法,子类必须显示调用,class Student String name;/姓名 int No;/学号 Student(String aName,int aNo) name=aName; No=aNo; System.out.println (“一个学生产生,姓名:“++“t学号:“+this.No); ,public class onJobStudent extends Student String title ;/职称 String company;/所在单位 ,重点 容易出错!,/情景3:父类只有带参数构造方法,子类必须显示调用 public class testStudent public static void main(String args) onJobStudent li=new onJobStudent(); ,Exception in thread “main“ java.lang.Error: 无法解析的编译问题: 构造函数 onJobStudent()不可视 at ch6.eg6_7.testStudent.main(testStudent.java:7),public class Student String name;/姓名 int No;/学号 Student() System.out.println(“一个学生产生“); ,public class onJobStudent extends Student String title ;/职称 String company;/所在单位 ,【任务6-8】情景4:子类无构造方法,隐含调用父类无参构造方法,/情景4:子类无构造方法,隐含调用父类无参构造方法 public class testStudent public static void main(String args) onJobStudent li=new onJobStudent(); ,一个学生产生,程序输出:,12班 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; pany=aCompany; System.out.println(“一个在职学生产生,职称:“+this.title+“ 单位:“+pany); ,public class Score / 示例:包含两个重载方法的类 int checkOnScore;/ 平时考勤成绩 int midTermScore;/ 期中考试成绩 int finalTermScore;/ 期末考试成绩 int designScore;/ 课程设计成绩 public Score(int checkOnScore, int midTermScore, int finalTermScore, int designScore) super(); this.checkOnScore = checkOnScore; this.midTermScore = midTermScore; this.finalTermScore = finalTermScore; this.designScore = designScore; ,【任务6-9】“静态”多态,计算期末成绩的几种方法,/ cPower,mPower,fPower分别为平时考勤、期中考试、期末考试成绩比重 double getResult(double cPower, double mPower, double fPower) return cPower * checkOnScore + mPower * midTermScore + fPower* finalTermScore; / dPower,fPower分别为课程设计、期末考试成绩比重 double getResult(double dPower, double fPower) return dPower * designScore + fPower * finalTermScore; ,【任务6-9】“静态”多态,public class TestScore / 演示调用对象的重载方法 public static void main(String args) Score s1 = new Score(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天,请你帮他计算出两种工资的结果,并输出较大的工资。,34班 6周课内容结束,6.2.2 类型转换,类和类之间的类型转换只能用在父类和子类间, 不能用在兄弟类, 更不能用在根本不相关的两个类之间。 类型转换的规则是: 子类向父类转换时,属于自动类型转换; 而父类要转换成子类时,就必须要使用强制类型转换了。 强制类型转换的语法就跟一般基本数据类型转换的语法一样,用小括号运算符配合要转换成的类来做转换的操作。,public class Animal String name; int age; ,public class Fish extends Animal public void swim() System.out.println(“swim“); ,public class test public static void main(String args) Animal a1=new Animal(); Fish f1=new Fish(); Fish f2=new Fish(); /子类到父类的转换:自然转换,显式和隐式都可以 a1=(Animal)f1;/显式转换 a1=f1;/隐式转换 /父类到子类的转换:强制转换,一定要显式转换 f2=(Fish)a1; /f2=a1;/语法错误提示;不能从Animal转换成Fish ,public class Bird extends Animal public void fly() System.out.println(“fly“); ,/兄弟类不能相互转换 public class test1 public static void main(String args) Bird b1=new Bird(); Fish f1=new Fish(); Animal a1=new Animal(); /直接转换显然不行 /b1=(Bird)f1;/错误提示:不能从Fish强制转换为Bird /f1=(Fish)b1;/错误提示:不能从Bird强制转换为Fish /通过父类Animal转换,语法可通过,运行出错! a1=b1; f1=(Fish)a1; ,Exception in thread “main“ java.lang.ClassCastException: ch6.eg6_10.Bird at ch6.eg6_10.test1.main(test1.java:14),【任务6-11】 “运行时多态”,Student,FullTimeStudent,OnJobStudent,Study(),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(+“每周末学习10个小时,每个学期学习20周“); ,public class FullTimeStudent extends Student /全日制学生 public FullTimeStudent(String aName, int aNo) super(aName, aNo); void study() System.out.println (+“工作日学习20个学时,每个学期学习20周“); ,【任务6-11】 “运行时多态”,任务实现,/父类对象指向不同子类对象实现运行时多态 public class test public static void main(String args) Student s = new Student5; s0 = new OnJobStudent(“jack“, 001); s1 = new OnJobStudent(“tom“, 002); s2 = new FullTimeStudent(“zhangsan“, 003); s3 = new FullTimeStudent(“李四“, 004); s4 = new FullTimeStudent(“王五“, 005); for (int i=0;i5;i+) si.study(); ,jack周末学习10个小时,每个学期学习20周 tom周末学习10个小时,每个学期学习20周 zhangsan工作日学习20个学时,每个学期学习20周 李四工作日学习20个学时,每个学期学习20周 王五工作日学习20个学时,每个学期学习20周,【任务6-11】 “运行时多态”,可以说圆柱是一个圆吗 可以说球是一个圆吗? 可以说某个圆是一个球吗? 球的对象可以转换为圆柱类对象吗?,类值之间的转换,课后问题,课后习题,2 ( )重载的方法可以通过它们的返回值类型的不同来区分 3 ( )同一个类中多个方法具有相同的方法名,不同的输入参数列表称为方法的重载。 4为了区分类中重载的同名的不同方法,要求( )。 A) 采用不同的形式参数列表 B) 返回值类型不同 C) 调用时用类名或对象名做前缀 D) 参数名不同,错,对,A,7周上机内容,三、覆盖与多态(运行时多态) (1)设计一个圆柱体Cylinder类继承Circle类,添加int类型变量height(圆柱体高)并覆盖Cirlce类的求面积double area()方法。 (2)设计一个球体Sphere类继承Circle类,并覆盖Cirlce类的求面积double area()方法。 (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,红色代表还没学 暂时不做,c,3. 下面是有关子类继承父类构造函数的描述,(父类只有带参数 的构造方法时),其中正确的是( )。 A) 如果子类没有定义构造函数,则子类无构造函数 B) 子类构造函数必须通过super关键字调用父类的构造函数 C)子类必须通过this关键字调用父类的构造函数 D)子类无法继承父类的构造函数 4. 现有两个类A、B,以下描述中表示B继承自A的是( )。 A) class A extends B B) class B implements A C) class A implements B D) class B extends A,B,D,5. 子类可以继承父类的_成员。构造函数也能被继承和重载。 6. 如果子类中的某个变量的变量名与它的父类中的某个变量完全一样,则称子类中的这个变量_了父类的同名变量。 7. 属性的隐藏是指子类重新定义从父类继承来的_。,灰色代表做过了,非私有,隐藏,同名变量或者属性,8. 如果子类中的某个方法的名字、返回值类型和_与它的父类中的某个方法完全一样,则称子类中的这个方法覆盖了父类的同名方法。 9. 抽象、封装、_和多态是Java语言的四大特性。 10. 在Java语言中,使用_和多态等技术,实现软件重用。,参数列表,继承,封装,11. Java 仅支持类间的_ _重继承。 12. 子类的成员变量能与其父类的成员变量同名吗? 13. 什么是方法覆盖? 14. 一个子类可以重新定义从父类那里继承来的同名方法。但是,允许它们有不同类型的返回值吗?,单,不能,(子类重新定义继承自父类的同名方法,使之实现与父类方法不同的功能;方法覆盖要求子类方法头定义必须与父类方法头定义完全一样。),能,15. 子类对象如何引用被它隐藏了的父类的属性和调用被它覆盖了的父类的方法? 16. 子类的对象能直接向其父类对象赋值吗?反之呢?子类对象一定是父类的对象吗? 17. Java语言中定义接口的关键字是什么?接口的继承应如何实现?接口支持多继承吗,Super.x,Super.y();,能 不能,对,interface;使用关键字extends实现;支持,18. java中,一个子类可以有多个父类吗?可以为一个(父)类定义多个子类吗? 19. 保留字 this 代表什么?,不可以,可以,代表自己本身这个对象,20.下面是一个小程序的主类myprogram的定义, 其中A、B是该主类所在源程序中已定义的另两个类的类名,完成程序填空。 import java awt.*; import java applet.*; public class myprogram extends Applet /定义小程序的主类 A a; B b; public _ init( ) a=new A( ); b=_ B( ); ,(void new),21.下面是一个类的定义,完成程序填空。 public class Youwrite int x; _( ) x=0; Youwrite ( int x) _; ,(Youwrite this.x=x;),22.现有类说明如下,请回答问题: public class A String str1=“ Hello! t“; String str2=“ How are you? “; public String toString( ) return str1+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! How are you?),(Hello,Bill.),23.现有一个类定义如下,请回答问题: class Employee String name; int age; double wage; static int No=0; Employee(String a1,int a2,double a3) name=a1; age=a2; wage=a3; No+; 问题:1),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.阅读程序,回答问题。 public class InheritTest1 public
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 战略管理流程与风险评估试题及答案
- 掌握网络管理员考试核心内容的试题及答案
- 绿色产业的经济政策支持试题及答案
- 数据管理与战略决策的风险试题及答案
- 2025届浙江省温州市瑞安市集云实验学校数学七下期末质量检测试题含解析
- 社团文化节的举办方案计划
- 法学概论前沿研究的试题及答案
- 2025届大庆市重点中学七下数学期末复习检测试题含解析
- 行政管理创新思维试题及答案
- 秘书工作的心理调适技巧计划
- 2022年西双版纳景洪市事业单位选调考试真题
- DB14-T 2373-2021 12345政务服务便民热线工单分类与编码
- 1纪委监委执纪审查案件卷宗模版检查卷模版
- 区域地理-加拿大
- 浙江抽水蓄能电站引水系统土建工程实施性施工组织设计知名企业
- 2023年汽车设计习题库含答案
- 2023年安徽中烟阜阳卷烟厂招聘笔试参考题库附带答案详解
- 2021年教师结构化面试试题汇总
- 劳动教养心灵-劳动教育在小学《道德与法治》课程中的实践初探 论文
- 《硬件工程师手册(全)》
- 内部控制风险评估
评论
0/150
提交评论