java速成第六章继承和多态.ppt

上传人:小飞机 文档编号:6510280 上传时间:2023-11-07 格式:PPT 页数:65 大小:252KB
返回 下载 相关 举报
java速成第六章继承和多态.ppt_第1页
第1页 / 共65页
java速成第六章继承和多态.ppt_第2页
第2页 / 共65页
java速成第六章继承和多态.ppt_第3页
第3页 / 共65页
java速成第六章继承和多态.ppt_第4页
第4页 / 共65页
java速成第六章继承和多态.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《java速成第六章继承和多态.ppt》由会员分享,可在线阅读,更多相关《java速成第六章继承和多态.ppt(65页珍藏版)》请在三一办公上搜索。

1、第六章 面向对象,三、类的继承,在 Java 中,类是一个层次结构,其中Object为特殊超类或基类,所有的类都直接或间接地继承Object类;子类继承父类的属性和方法,同时也可以修改父类的属性或重载父类的方法,以及在父类的基础上添加新的属性和方法。因此,父类和子类之间反映的是“一般与特殊”的关系。,父类与子类,在类的继承中,被继承的类称为父类,继承而来的类则称为子类。有多个子类共同继承一个父类,那么这个父类就是多个类的基类。Java语言只支持单继承,如果要定义多继承,可以使用将要讲解的接口方法。,何时选择继承性?,一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.,常犯的错误A有一个

2、B吗?例如让汽车轮子成为汽车的子类是错误的,继承的实现,定义继承的形式为:访问权限 class 类名 extends 父类 类体 Java中的继承是通过extends关键字来实现的,在定义类时使用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系。新定义的类称为子类,它可以从父类那里继承所有非private的属性和方法作为自己的成员。,继承举例,一个类有多个父类:多继承,一个类只有一个父类:单继承,任务6-1,public class Student String name;/姓名 int No;/学号 String Info()return 姓名:+name+学号:+No;

3、,public class onJobStudent extends Student,public class testOnJobStudent public static void main(String args)onJobStudent li=new onJobStudent();li.name=李丽;li.No=20080101;System.out.println(li.Info();,程序输出:姓名:李丽学号:20080101,程序说明:子类自动拥有父类的非私有属性和方法,public class StudentString name;/姓名int No;/学号 String In

4、fo()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 onJobStu

5、dent();zhang.name=张三;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

6、 Apublic 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()。(

7、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 StudentString name;/姓名int No;/学号String address=广州精英学

8、院;/学校地址 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)o

9、nJobStudent 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+

10、n职称:+title+t单位:+company;,任务6-4:子类与父类方法同名,public class testStudent public static void main(String args)onJobStudent zhang=new onJobStudent();zhang.name=张三;zhang.No=20081002;pany=广州宝杰公司;zhang.title=工程师;System.out.println(zhang.Info();,姓名:张三学号:20081002职称:工程师 单位:广州宝杰公司,任务6-4:子类与父类方法同名,任务34总结,子类和父类如果拥有相同

11、名称的属性和方法,则先找到自己的使用如果要越级使用父类的属性和方法,应该用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 c

12、ompany;/所在单位 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)onJobStude

13、nt zhang=new onJobStudent(张三,20010909,工程师,广州宝杰公司);,一个学生产生,姓名:张三学号:20010909一个在职学生产生,职称:工程师 单位:广州宝杰公司,程序输出:,onJobStudent(String aName,int aNo,String aTitle,String aCompany),【任务6-6】情景2:子类隐含调用父类不带参数构造方法,public class StudentString name;/姓名int No;/学号 Student()System.out.println(一个学生产生);,public class onJob

14、Student 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();,程序输出:,一个学生产生一个在职学生产生,以上两个例子

15、说明,父类的无参数的构造函数,无论子类是否显式调用,它都是存在于子类构造函数中并发挥作用的,【任务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;/所在单位

16、,重点容易出错!,/情景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 StudentString name;/姓名int No;/学号S

17、tudent()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表

18、示自己本身这个类,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=aCo

19、mpany;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=che

20、ckOnScore;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*finalTermScor

21、e;/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)

22、;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 类型转换,类和类之间的类型转换只能用在父类和子类间,不能用在兄弟

23、类,更不能用在根本不相关的两个类之间。类型转换的规则是:子类向父类转换时,属于自动类型转换;而父类要转换成子类时,就必须要使用强制类型转换了。强制类型转换的语法就跟一般基本数据类型转换的语法一样,用小括号运算符配合要转换成的类来做转换的操作。,public class Animal String name;int age;,public class Fish extends Animalpublic void swim()System.out.println(swim);,public class test public static void main(String args)Animal

24、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 Animalpublic void fly()System.out.println(fly);,/兄弟类不能相互转换 public class test1 public static void main

25、(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 at ch6.eg6_10.test1.main(test1.java:14),【任务6-11】“运行时多态”,Student,FullTimeStuden

26、t,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(this.name+每

27、周末学习10个小时,每个学期学习20周);,public class FullTimeStudent extends Student/全日制学生public FullTimeStudent(String aName,int aNo)super(aName,aNo);void study()System.out.println(this.name+工作日学习20个学时,每个学期学习20周);,【任务6-11】“运行时多态”,任务实现,/父类对象指向不同子类对象实现运行时多态public class test public static void main(String args)Student

28、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周王五

29、工作日学习20个学时,每个学期学习20周,【任务6-11】“运行时多态”,可以说圆柱是一个圆吗可以说球是一个圆吗?可以说某个圆是一个球吗?球的对象可以转换为圆柱类对象吗?,类值之间的转换,课后问题,课后习题,2()重载的方法可以通过它们的返回值类型的不同来区分3()同一个类中多个方法具有相同的方法名,不同的输入参数列表称为方法的重载。4为了区分类中重载的同名的不同方法,要求()。A)采用不同的形式参数列表 B)返回值类型不同 C)调用时用类名或对象名做前缀 D)参数名不同,错,对,A,7周上机内容,三、覆盖与多态(运行时多态)(1)设计一个圆柱体Cylinder类继承Circle类,添加int

30、类型变量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)线程

31、的 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

32、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语言中,使用_和

33、多态等技术,实现软件重用。,参数列表,继承,封装,11.Java 仅支持类间的_ _重继承。12.子类的成员变量能与其父类的成员变量同名吗?13.什么是方法覆盖?14.一个子类可以重新定义从父类那里继承来的同名方法。但是,允许它们有不同类型的返回值吗?,单,不能,(子类重新定义继承自父类的同名方法,使之实现与父类方法不同的功能;方法覆盖要求子类方法头定义必须与父类方法头定义完全一样。),能,15.子类对象如何引用被它隐藏了的父类的属性和调用被它覆盖了的父类的方法?16.子类的对象能直接向其父类对象赋值吗?反之呢?子类对象一定是父类的对象吗?17.Java语言中定义接口的关键字是什么?接口的继承

34、应如何实现?接口支持多继承吗,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;pu

35、blic _ 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(

36、),这种现象分别称为什么?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

37、 int No=0;Employee(String a1,int a2,double a3)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.阅读程序,回答问题。publ

38、ic class InheritTest1 public static void main(String args)A aa;B bb;aa=new A();bb=new B();aa.show();bb.show();class A int a=1;double d=2.0;void show()System.out.println(Class A:+ta=+a+td=+d);问题:1)这是哪一类java程序?2)类A和类B是什么关系?3)按程序输出的格式写出程序运行后的结果.,class B extends A float a=3.0f;String d=Java program.;int

39、 b=4;void show()System.out.println(Class A:+ta=+super.a+td=+super.d);super.show();System.out.println(Class B:+ta=+a+td=+d+tb=+b);,26.现有类说明如下,请回答问题:class A int x=10;int getA()return x;class B extends A int x=100;int getB()return x;问题:1)类B是否能继承类A的属性x?2)若b是类B的对象,则b.getB()的返回值是什么?3)若b是类B的对象,则b.getA()的返回

40、值是什么?4)类A和类B都定义了x属性,这种现象称为什么?,27.有如下源程序,请回答问题:class A String s=class A;class B extends A String s=class B;public class TypeConvertpublic static void main(String args)B b1,b2=new B();A a1,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.

41、println(b2.s);问题:该程序的四行输出各是什么?,28.现有类说明如下,请回答问题:public class A int x=888;String str=I like:;public String toString()return str+x;问题:1)类A和类B是什么关系?2)类A和类B都定义了x属性和方法toString(),这种现象分别称为什么?3)若a是类A的对象,则a.toString()的返回值是什么?4)若b是类B的对象,则b.toString()的返回值是什么?,public class B extends A String x=java;public String toString()return str+x+and+super.x;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号