深入类ch5-2构造函数重载.ppt_第1页
深入类ch5-2构造函数重载.ppt_第2页
深入类ch5-2构造函数重载.ppt_第3页
深入类ch5-2构造函数重载.ppt_第4页
深入类ch5-2构造函数重载.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

Chapter 5,深入类,主要内容,类的多态性 或称为 函数方法(成员)的重载 构造函数 类的继承性 接口,8-1 方法的重载(overload),8-1-1 重载,所谓的“重载”是指相同的方法名称,若参数个数不同,或参数个数相同、类型不同的话,方法便具有不同的功能。,范例:,01 / app8_1, 圆形类CCircle,加入字符串类型的color成员 02 class CCircle / 定义类CCircle 03 04 private String color; 05 private double pi=3.14; 06 private double radius; 07 08 public void setColor(String str) / 赋值color的方法,09 color=str; 10 11 public void setRadius(double r) / 赋值radius的方法 12 radius=r; 13 14 public void setAll(String str, double r) / 同时赋值 color与radius 15 color=str; 16 radius=r; 17 18 public void show() / 输出半径、颜色与圆面积 19 System.out.println(“color=“+color+“, Radius=“+radius); 20 System.out.println(“area=“+pi*radius*radius); 21 22 ,23 24 public class app8_1 25 26 public static void main(String args) 27 28 CCircle cir1=new CCircle(); 29 30 cir1.setColor(“Red“); / 赋值cir1的color 31 cir1.setRadius(2.0); / 赋值cir1的radius 32 cir1.show(); 33 34 cir1.setAll(“Blue“,4.0); / 同时赋值cir1的color和radius 35 cir1.show(); 36 37 ,/* app8-1 OUTPUT- color=Red, Radius=2.0 area=12.56 color=Blue, Radius=4.0 area=50.24 -*/,下面的例子把app8_1的setColor()、setRadius()与setAll()三个方法用Java重载的特性,以单一方法 setCircle来取代。,从本例可看出,setColor()、setRadius()与setAll()均是在赋值对象的数据成员,这好比是家中分别买了冷气机、暖气机和除湿机一样,不但占空间,且维护上也不方便。Java的重载功能,恰可补足这方面的缺憾。,01 / app8_2, 函数的重载 02 class CCircle / 定义类CCircle 03 04 private String color; 05 private double pi=3.14; 06 private double radius; 07 08 public void setCircle(String str) / 赋值color成员 09 color=str; 10 11 public void setCircle(double r) / 赋值radius成员,12 radius=r; 13 14 public void setCircle(String str, double r) / 同时赋值color与radius 15 color=str; 16 radius=r; 17 18 public void show() 19 System.out.println(“color=“+color+“, Radius=“+radius); 20 System.out.println(“area=“+pi*radius*radius); 21 22 23 24 public class app8_2 25 ,26 public static void main(String args) 27 28 CCircle cir1=new CCircle(); 29 30 cir1.setCircle(“Red“); / 调用第8行的setCircle() 方法 31 cir1.setCircle(2.0); / 调用第9行的setCircle() 方法 32 cir1.show(); 33 34 cir1.setCircle(“Blue“,4.0); / 调用第14行的setCircle() 方法 35 cir1.show(); 36 37 ,/* app8-2 OUTPUT- color=Red, Radius=2.0 area=12.56 color=Blue, Radius=4.0 area=50.24 -*/,从上例可看出,通过方法的重载,只需有一个方法名称,却可拥有不同的功用,使用起来相当的方便。,图8-1 使用重载时,方法会根据参数的个数与类型来调用相对应的方法,8-1-2 使用重载常犯的错误,使用重载时,它的方法是根据参数的个数与类型来调用相对应方法,因此每一个方法的参数个数或参数类型必须不同。,参数个数或参数类型完全相同,而只有返回类型不同的不能进行重载。例如,下面的程序代码是行不通的:,public void setCircle(double radius); public int setCircle(double radius);,其原因是,一旦调用了setCircle() 方法,则程序无法判断是哪一个方法被调用。事实上,尝试编译这样子的方法,compiler也会出现错误信息,多态使程序简洁,为程序员带来很大便利。在面向对象编程中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。 类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。,82 构造函数,8-2-1 构造函数的基本认识,标识符 类名称(类型1 参数1, 类型2 参数2,.) 程序语句 ; ,请注意:构造函数的名称必须与其所属之类的类名称相同,8-2-2 构造函数的调用时机,如前节所述,构造函数除了没有返回值,且名称必须与类的名称相同之外,它的调用时机也与一般的方法不同。 一般的方法是在需要用到时才调用,而构造函数则是在创建对象时,便会自动调用,并执行构造函数的内容。因此,构造函数不需从程序直接调用,而是在对象产生时自动执行。,以下列简单的例子来说明构造函数的使用:,01 / app8_3, 构造函数的使用 02 class CCircle / 定义类CCircle 03 04 private double pi=3.14;,05 private double radius; 06 07 public CCircle(double r) / 定义构造函数CCircle() 08 radius=r; 09 10 public void show() 11 System.out.println(“radius=“+radius+“, area=“+pi*radius*radius); 12 13 14 15 public class app8_3 17 public static void main(String args) 18 ,19 CCircle cir1=new CCircle(4.0); / 创建对象并调用 CCircle()构造函数 20 cir1.show(); 21 22 /* app8-3 OUTPUT- radius=4.0, area=50.24 -*/,程序第79行定义了构造函数CCircle(),其主要的功用是把radius成员赋值为r (即构造函数所接收的参数)。注意(1)构造函数的名称与类名称相同,都是CCircle。 (2)构造函数CCircle()并没有返回值,即使没有返回值,在定义构造函数还是不能加上void这个字,否则在编译时将出现错误。,8-2-3 构造函数的重载,在Java里,不仅方法可以重载,构造函数也可以重载。 在8-1节已经提过,只要方法与方法之间的参数个数不同,或者是类型不同,便可定义多个名称相同的方法,这也就是方法的重载。,再以CCircle为例,下面的程序是从app8_2修改,只是把setCircle() 方法的重载改为构造函数的重载,如下面的范例:,01 / app8_4,构造函数的重载 02 class CCircle / 定义类CCircle 03 04 private String color; 05 private double pi=3.14; 06 private double radius; 07 08 public CCircle() / 没有参数的构造函数 09 System.out.println(“constructor CCircle() called“); 10 radius=1.0; 11 color=“Green“; 12 13 public CCircle(String str, double r) / 有两个变量的构造函数,14 System.out.println(“constructor CCircle(String,double) called“); 15 color=str; 16 radius=r; 17 18 public void show() 19 System.out.println(“color=“+color+“, Radius=“+radius); 20 System.out.println(“area=“+pi*radius*radius); 21 22 23 24 public class app8_4 25 ,26 public static void main(String args) 27 28 CCircle cir1=new CCircle(); 29 cir1.show(); 30 31 CCircle cir2=new CCircle(“Blue“,4.0); 32 cir2.show(); 33 34 /* app8-4 OUTPUT- constructor CCircle() called color=Green, Radius=1.0 area=3.14 constructor CCircle(String,double) called color=Blue, Radius=4.0 area=50.24 -*/,app8_4共定义了两个不同参数构造函数CCircle()。第一个构造函数CCircle()定义在第811行,它没有任何参数,其作用是把radius成员设为1.0,把color成员设为“Green”。第二个构造函数CCircle(String,double)则定义在第1317行,它可分别接收String和double两个类型的参数,再将成员设为相对应的值。,8-2-4 从某一构造函数调用另一构造函数,从某一构造函数内调用另一构造函数,是通过this()这个关键字来调用的,如下面的范例:,01 / app8_5, 从某一构造函数调用另一构造函数 02 class CCircle / 定义类CCircle 03 04 private String color; 05 private double pi=3.14; 06 private double radius; 07 08 public CCircle() / 没有参数的构造函数 09 this(“Green“,1.0); 10 System.out.println(“constructor CCircle() called“); 11 ,12 public CCircle(String str, double r) / 有参数的构造函数 13 System.out.println(“constructor CCircle(String,double) called“); 14 color=str; 15 radius=r; 16 17 public void show() 18 System.out.println(“color=“+color+“, Radius=“+radius); 19 System.out.println(“area=“+pi*radius*radius); 20 21 22,23 public class app8_5 24 25 public static void main(String args) 26 27 CCircle cir1=new CCircle(); 28 cir1.show(); 29 30 /* app8-5 OUTPUT- constructor CCircle(String,double) called constructor CCircle() called color=Green, Radius=1.0 area=3.14 -*/,第9行则利用this()关键字调用了有参数的构造函数CCircle(String,double),并把color设为“Green”,radius设为1.0。其语法为:,注意在某一构造函数调用另一构造函数时,必须以this关键字来调用,而不能以构造函数直接调用,否则编译时将出现错误。例如,若把第9行改写为:,CCircle(“Green“,1.0); / 错误的构造函数调用,此外,this关键字必须写在构造函数内的第一行的位置,放错了地方也无法编译,this(“Green“,1.0); / 调用构造函数CCircle(String,double),程序说明:,8-2-5 构造函数的公有与私有,方法依实际需要,可设为public与private。相同的,构造函数也有public与private之分。 到目前为止,我们所使用的构造函数均属于public,因此它可以在程序的任何地方被调用,所以新创建的对象均可自动调用它。 如果构造函数被设成private,则无法在该构造函数所在的类以外的地方被调用。如下面的范例:,01 / app8_6, 公有与私有构造函数 02 class CCircle / 定义类CCircle 03 04 private String color; 05 private double pi=3.14; 06 private double radius; 07,08 private CCircle() / 私有构造函数 09 System.out.println(“private constructor called“); 10 11 public CCircle(String str, double r) / 公有构造函数 12 this(); 13 color=str; 14 radius=r; 15 16 public void show() 17 System.out.println(“color=“+color+“, Radius=“+radius); 18 System.out.println(“area=“+pi*radius*radius); 19 20 21,22 public class app8_6 23 24 public static void main(String args) 25 26 CCircle cir1=new CCircle(“Blue“,1.0); 27 cir1.show(); 28 29 /* app8-6 OUTPUT- private constructor called color=Blue, Radius=1.0 area=3.14 -*/,8-2-6 构造函数的省略,在第7章与第8章的8-1节所介绍构造函数之

温馨提示

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

评论

0/150

提交评论