面向对象程序设计第10讲 Java的继承与多态(二)_第1页
面向对象程序设计第10讲 Java的继承与多态(二)_第2页
面向对象程序设计第10讲 Java的继承与多态(二)_第3页
面向对象程序设计第10讲 Java的继承与多态(二)_第4页
面向对象程序设计第10讲 Java的继承与多态(二)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第10讲Java的继承与多态(二)方法覆盖super&this关键字final关键字Object类多态的定义与作用构造方法的重载/教学目标掌握实现方法覆盖的方法掌握super、this关键字的意义及使用方法掌握final关键字的意义及使用方法理解Object类的作用及其常用方法了解多态的意义掌握重载的使用方法super关键字的使用在Java的覆盖机制中,子类中的同名成员变量或方法隐藏了超类的成员变量或方法,如果在子类中,希望使用父类中的那些被子类覆盖的成员或方法,就需要借助于super这个关键字。另外,若在子类中调用父类的构造方法,也需要利用super实现。super使用方法如下:super.成员变量名称

//使用父类的成员变量super.方法名称(参数列表)//使用父类的方法this关键字的使用this使用方法如下:this.成员变量名称

//使用自身成员变量this.方法名称(参数列表)//使用当前类的方法super——用来表示直接父类。this——访问当前对象。当在一个类中要明确指出使用当前对象本身的变量或方法时,就可以使用this关键字代表当前类。this的另一个用途是调用当前对象的另一个构造方法。假如一个类中定义了几个构造方法,可以使用this关键字引用当前类中定义的其他构造方法。classPerson{ //定义Person类

protectedStringname;//姓名

protectedStringsex;//性别

protectedintage;//年龄

publicvoidregister(Stringn,Strings,inta){ //设置数据成员

name=n; sex=s; age=a;}publicvoidshowMe(){ //显示人员信息

System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age);}}类Person中定义了3个成员和2个方法register()和showMe()。在方法showMe()中,可以使用来替换name,this代表Person类对象本身。super&this示例classStudentextendsPerson{privateStringdepartment; //系别

privateStringspecialty; //专业

publicvoidstudentRegister(Stringn,Strings,inta,Stringdep,Stringspe){ super.register(n,s,a); //调用父类方法

this.department=dep; //访问自身成员变量

this.specialty=spe; //访问自身成员变量

}publicvoidshowStudent(){ //显示学生类数据成员

System.out.println("姓名:"++",性别:"+super.sex+",年龄:"+super.age+",系别:"+this.department+",专业:"+this.specialty);}}方法studentRegister()中,使用super表示父类对象,super.register()即调用了父类对象方法register();使用this表示当前类对象,this.department即引用了当前类对象成员department。super&this示例(续)publicclassEx6_4{publicstaticvoidmain(Stringargs[]){Studentstudent1=newStudent();student1.studentRegister("张三","男",18,"计算机","软件开发");student1.showStudent(); }}运行结果:姓名:王兰,性别:女,年龄:16姓名:张三,性别:男,年龄:18,系别:计算机,专业:软件开发程序分析:Student类中使用super.register()的方式访问父类中定义的register()方法,而访问本身的数据成员,则通过this关键字实现。通常,this关键字可以省略。使用super除了可以访问父类的普通方法外,还可以访问父类的构造方法。super&this示例(续)classPerson{protectedStringname;//姓名

protectedStringsex;//性别

protectedintage;//年龄

publicPerson(){ }//无参构造方法

publicPerson(Stringn,Strings,inta){//构造方法

name=n; sex=s; age=a;}publicvoidshowMe(){ //显示人员信息

System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age);}}Person类中定义了2个构造方法,这是方法的重载。程序在调用时会根据实参的个数自动匹配相应的构造方法。super示例classStudentextendsPerson{privateStringdepartment; //系别

privateStringspecialty; //专业

publicStudent(Stringn,Strings,inta,Stringdep,String

spe){ super(n,s,a); //调用了父类的构造方法

department=dep; specialty=spe;}publicvoidshowMe(){//显示学生类数据成员

System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age+",系别:"+department+",专业:"+specialty);}}在Student类的构造方法中,使用super(n,s,a)调用了父类构造方法。由于super(n,s,a)有3个实参,程序匹配Person类中定义的构造方法Person(Stringn,Strings,inta)super示例(续)publicclassEx6_5{publicstaticvoidmain(Stringargs[]){ Personperson1=newPerson("王兰","女",16); person1.showMe(); Studentstudent1=newStudent("张三","男",18,"计算机","软件开发"); student1.showMe(); }}运行结果:姓名:王兰,性别:女,年龄:16姓名:张三,性别:男,年龄:18,系别:计算机,专业:软件开发程序分析:定义Student类的构造方法时,使用了super()方法访问了父类的构造方法,对相应的数据成员进行了初始化操作super示例(续)final关键字的使用覆盖(overriding)固然有其便利性,但在设计类时,如果基于某些因素,父类的方法不希望子类的方法来覆盖它,便可在父类的方法之前加上“final”关键字,如此该方法便不会被覆盖。finalclassStudentextendsPerson{……}classStudentOfComputerextendsStudent{privateStringgrade; //年级}编译这个文件,编译器报错:cannotinheritfromfinalStudent。因为Student为final类,所以它拒绝StudentOfComputer继承Student。Object类Object类抽象了所有类共有的一些属性和方法,它是一切类的父类,所有的类均直接或间接继承它,是类之源。所以,Person类的父类是Object类。

Object类Person类Student类Object类的方法方法主要功能toString()以String类对象的形式返回当前对象的字符串描述equals()通过参数带入一个对象,并将它与当前对象进行比较,测试的是两个对象是否相等getClass()

返回一个Class类对象,该对象内部包含了一些能够标识当前对象的信息hashCode()计算一个对象的哈希码,并将其返回notify()唤醒一个与当前对象关联的线程notifyAll()唤醒与当前对象关联的所有线程wait()使线程等待一个指定的时间间隔或等待另一个线程调用当前对象的notify()或notifyAll()方法getClass()方法的使用getClass()方法返回一个Class类对象,该对象内部包含了一些能够标识当前对象的信息。如果想知道某个对象obj是属于哪个类时,可用obj.getClass()来查询classA{privateintnum;publicA(inta){num=a;}}publicclassEx6_7{publicstaticvoidmain(Stringargs[]){Aa=newA(1); //创建A类的对象aClassca=a.getClass();//用对象a调用getClass()方法

System.out.println("classofobj="+ca);}}运行结果:classofobj=ClassA程序的输出显示,类对象a属于类A。输出中含字符串"Class",代表A是一个类。equals()方法的使用classA{privateintnum;publicA(inta){ num=a;} }publicclassEx6_8{publicstaticvoidmain(Stringargs[]){ Aa=newA(1); Ab=newA(5); Ac=a;//声明类变量c,让它指向a所指向的对象

Booleanbr1=a.equals(b);//测试a与b是否指向同一对象

Booleanbr2=a.equals(c);//测试a与c是否指向同一对象

System.out.println("a.equals(b)="+br1);

System.out.println("a.equals(c)="+br2);} }equals()方法通过参数带入一个对象,将它与当前对象进行比较,测试两个对象是否相等。如果是,则返回true,否则返回false。运行结果:a.equals(b)=falsea.equals(c)=truetoString()方法的使用toString()方法的功能是将对象的内容转换成字符串,并返回其内容。例如,若变量a是指向由类A所创建的对象时,则下面的语句会调用toString()方法,并输出所指向对象的内容:

Aa=newA(2);

System.out.println(a);

上面的语句是以类类型的变量a当成println()的参数,此时,Java会先通过变量a调用toString()方法,再把结果当成println()的参数。也可以用下面的语法来便编写相同功能,且容易理解的语句: System.out.println(a.toString());运行结果:A@6b97fdclassA{privateintnum;publicA(inta){ num=a;}publicStringtoString(){//覆盖toString()方法

Stringstr="toString()called,num="+num; returnstr;} }publicclassEx6_10{ publicstaticvoidmain(Stringargs[]){ a=newA(2);

System.out.println(a.toString());} }运行结果:toString()called,num=2覆盖Object类的toString()方法重载

所谓的“重载”是指相同的方法名称,若参数个数不同,或参数个数相同、类型不同的话,方法便具有不同的功能。重载是多态技术的一种。运用方法重载需要注意的是,可以定义名称相同,但参数不同的方法;但不可以定义名称相同,而且参数也完全一致的方法。例如,下面的程序代码有误。publicvoidsetPerson(intage);publicint

setPerson(intage);其原因是,一旦调用了setPerson()方法,程序无法判断是哪一个方法被调用。事实上,若尝试编译这样的类,编译器也会出现错误信息。多态的定义与作用

多态是在类体系中把设想(想要“做什么”)和实现(该“怎么做”)分开的手段,它是从设计的角度考虑的。多态性意味着某种概括的动作可以由特定的方式来实现,这种特定的方式取决于执行该动作的对象。如果从面向对象的语义角度来看,可以简单理解为多态就是“相同的表达式,不同的操作”,也可以说成“相同的命令,不同的操作”。多态有两种情况,一种是覆盖技术,另外就是重载技术。覆盖是在子类中直接定义和父类同样的属性和方法,但重新编写了方法体,即子类与父类方法的形参与返回值都相同,而内部处理不同,这种方法在使用过程中,Java虚拟机会根据调用这个方法的类来确定哪个方法被调用。classPerson{//定义Person类protectedStringname;//姓名protectedStringsex;//性别protectedintage;//年龄

publicvoidregister(Stringn,Strings){//设置姓名和性别 name=n; sex=s;}publicvoidregister(inta){

age=a;}//设置年龄

publicvoidregister(Stringn,Strings,inta){//设置数据成员

name=n; sex=s; age=a;}publicvoidshowMe(){//显示人员信息

System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+age);} }定义了3个register()方法,3个方法具有不同的参数列表。多态示例publicclassEx6_11{publicstaticvoidmain(Stringargs[]){ Personp1=newPerson(); Personp2=newPerson(); p1.register("张三","男",18);

p2.register("李欣","女"); p2.register(17); p1.showMe(); p2.showMe();} }运行结果:姓名:张三,性别:男,年龄:18姓名:李欣,性别:女,年龄:17根据实参的不同,自动匹配调用相应的方法多态示例(续)构造方法的重载

在Java中,不仅方法可以重载,构造方法也可以重载。同普通方法的重载,可以在一个类中定义几个构造方法,只要构造方法的参数列表不同即可。

classPerson{protectedStringname;protectedStringsex;protectedintage;

publicPerson(){//没有参数的构造方法

System.out.println("Person()constructoriscalled!");}构造方法重载示例

publicPerson(StringPName,String

PSex){//有两个变量

name=PName;sex=PSex;

System.out.println("Person(String,String)constructoriscalled!");

System.out.println("姓名:"+name+""+"性

温馨提示

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

评论

0/150

提交评论