第继承和多态_第1页
第继承和多态_第2页
第继承和多态_第3页
第继承和多态_第4页
第继承和多态_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1第继承和多态8.2父类和子类UML图CircleCircleMethodsCircleData父类继承CylinderCircleMethodsCylinderMethodsCircleDataCylinderData子类第1页/共41页//Cylinder.java:Cylinder类的定义描述publicclassCylinderextendsCircle{privatedoublelength=1;

/**Returnlength*/publicdoublegetLength(){returnlength;}

/**Setlength*/publicvoidsetLength(doublelength){this.length=length;}

/**计算体积*/publicdoublefindVolume(){returnfindArea()*length;}}supertypesubtypeCylinder是由Circle派生而来第2页/共41页Cylindercylinder=newCylinder();System.out.println("Thelengthis"+cylinder.getLength());System.out.println("Theradiusis"+cylinder.getRadius());System.out.println("Thevolumeofthecylinderis"+cylinder.findVolume());System.out.println("Theareaofthecircleis"+cylinder.findArea());

Thelengthis1.0Theradiusis1.0Thevolumeofthecylinderis3.14159Theareaofthecircleis3.14159

输出结果是:

第3页/共41页8.3使用关键字

super调用父类的构造方法调用父类的方法关键字super指向使用它的类的父类,可以用于2种途径:注意:调用父类的构造方法必须使用super,并且这个调用必须放在构造方法的第一行。在子类中使用父类的构造方法的名字会引起语法错误。第4页/共41页注意构造方法用来构造类的实例。与属性和方法不同,父类的构造方法不直接传给子类,它们只能从子类的构造方法中用关键字super调用。第5页/共41页8.3.2构造方法链构造方法可以调用重载的构造方法或父类的构造方法。如果他们没有被显示的调用,编译器将把super()当作构造方法的第一条语句。

publicCylinder(){

}

等价于

publicCylinder(){

super();

}

publicA(doubled){

//somestatements

}

等价于

publicA(doubled){

super();

//somestatements

}

第6页/共41页8.3.2构造方法链publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}在任何情况下,构造一个类的实例,将会沿着继承链调用所有父类的构造方法,这叫构造方法链。第7页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}1.从main方法开始第8页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}2.调用Faculty构造方法第9页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}3.调用Employee的无参构造方法第10页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}4.调用Employee(String)构造方法第11页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}5.调用Person()构造方法第12页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}6.执行println第13页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}7.执行println第14页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}8.执行println第15页/共41页追踪执行过程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}

publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}

classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}

publicEmployee(Strings){System.out.println(s);}}

classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}9.执行println第16页/共41页没有无参构造方法的示例publicclassAppleextendsFruit{}

classFruit{publicFruit(Stringname){System.out.println("Fruit'sconstructorisinvoked");}}找出错误:

第17页/共41页声明一个子类子类可以扩展父类的方法和属性,所以可以在子类中:添加新的属性添加新的方法重写父类的方法第18页/共41页8.4方法覆盖子类从父类中继承方法。有时,子类必须修改父类中定义的方法,这叫方法覆盖。//Cylinder.java:cylinder类中覆盖findArea()publicclassCylinderextendsCircle{

/**Returnthesurfaceareaofthiscylinder.Theformulais*2*circlearea+cylinderbodyarea*/publicdoublefindArea(){return2*super.findArea()+2*getRadius()*Math.PI*length;}//Othermethodsareomitted}第19页/共41页注子类定义的方法必须与父类方法具有相同的头标志和相同的返回类型。实例方法仅当可访问时才能被覆盖。私有方法不能在定义它的类外访问,所以不能被覆盖。如果子类中定义的方法在父类中是私有的,那个这2个方法完全没有关系。静态方法也可以继承,但不能被覆盖。如果静态方法被重新定义,则父类的方法将被隐藏。第20页/共41页对象类ObjectJava中的每一个类都源于java.lang.Objectclass.如果没有指定一个类继承谁,它的父类就是Object.第21页/共41页equals()和hashCode()Methodsequals()

方法检查2个对象是否.equals()和==比较hashCode()

返回该对象的哈希码,返回对象在计算机内部存储的十六进制内存地址.第22页/共41页toString()方法toString()

方法返回一个代表该对象的字符串:类名+@+哈希码.

CylindermyCylinder=newCylinder(5.0,2.0);System.out.println(myCylinder.toString());

显示结果类似:Cylinder@15037e5.

通常情况下要重写toString()方法。

第23页/共41页多态性、动态绑定和一般程序设计publicclassTest{publicstaticvoidmain(String[]args){m(newGraduateStudent());m(newStudent());m(newPerson());m(newObject());}

publicstaticvoidm(Objectx){System.out.println(x.toString());}}

classGraduateStudentextendsStudent{}

classStudentextendsPerson{publicStringtoString(){return"Student";}}

classPersonextendsObject{publicStringtoString(){return"Person";}}方法m()采用Object型参数,所以可以用任何对象。同名的不同方法可以在程序中共存,称为多态,以覆盖和重载2种形式体现。GraduateStudent,Student,Person,andObject

每个类都有自己的toString()方法,采用哪一种实现有JVM在运行时动态决定,这种能力成为动态绑定。第24页/共41页一般程序设计publicclassTest{publicstaticvoidmain(String[]args){m(newGraduateStudent());m(newStudent());m(newPerson());m(newObject());}

publicstaticvoidm(Objectx){System.out.println(x.toString());}}

classGraduateStudentextendsStudent{}

classStudentextendsPerson{publicStringtoString(){return"Student";}}

classPersonextendsObject{publicStringtoString(){return"Person";}}多态性一般允许方法使用范围更广的对象参数,这称为一般程序设计。如果一个方法的参数类型是父类,可以向该方法传递这个参数子类的任何对象。第25页/共41页8.7对象类型转换语句m(newStudent());将对象newStudent()传递给了Object类型参数.该语句等价于:Objecto=newStudent();//Implicitcastingm(o);隐式类型转换第26页/共41页为什要转换假设:Studentb=o;

因为Student对象的总是Object对象的实例,但是Object对象的实例不一定是Student对象的实例。使用显示类型转换:Studentb=(Student)o;//Explicitcasting错误?第27页/共41页父类和子类之间的转换将一个子类的实例转换为一个父类的变量总是可行的,称为向上转换;将一个父类的实例转换为一个子类的变量称为向下转换;向下转换不一定总能成功。???CylindermyCylinder=(Cylinder)myCircle;Applex=(Apple)fruit;Orangex=(Orange)fruit;第28页/共41页instanceof

运算符为确保转换的对象是子类的一个实例,使用instanceof运算符:CirclemyCircle=newCircle();if(myCircleinstanceofCylinder){CylindermyCylinder=(Cylinder)myCircle;...}第29页/共41页Example8.1

演示多态和对象转换创建2个对象,一个圆和一个圆柱,并调用displayObject方法显示它们。TestPolymorphismCastingRun第30页/共41页8.8隐藏数据可以覆盖一个实例方法,但是不能覆盖一个数据域(实例或静态的)或静态方法。如果在子类中声明的数据域或静态方法与父类中的名字相同,父类中的将被隐藏,但是它依旧存在。在子类中可以使用super关键字调用隐藏的数据域或静态方法。第31页/共41页protected

数据和方法protected

修饰符可以应用于类中的数据和方法。公用类中保护的数据或方法可以被它的子类或同一包中的任何类访问,即使子类在不同的包中也可以。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论