深入类ch52构造函数重载

上传人:大米 文档编号:591397520 上传时间:2024-09-17 格式:PPT 页数:32 大小:308.21KB
返回 下载 相关 举报
深入类ch52构造函数重载_第1页
第1页 / 共32页
深入类ch52构造函数重载_第2页
第2页 / 共32页
深入类ch52构造函数重载_第3页
第3页 / 共32页
深入类ch52构造函数重载_第4页
第4页 / 共32页
深入类ch52构造函数重载_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《深入类ch52构造函数重载》由会员分享,可在线阅读,更多相关《深入类ch52构造函数重载(32页珍藏版)》请在金锄头文库上搜索。

1、Chapter 5深入类深入类主要内容类的多态性或称为 函数方法(成员)的重载构造函数类的继承性接口8-1 方法的重载(overload)8-1-1 8-1-1 重载重载 所谓的“重载”是指相同的方法名称,若参数个数不同,或参数个数相同、类型不同的话,方法便具有不同的功能。 范例范例: :01 / app8_1, 01 / app8_1, 圆形类圆形类圆形类圆形类CCircleCCircle,加入字符串类型的,加入字符串类型的,加入字符串类型的,加入字符串类型的colorcolor成员成员成员成员02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类

2、CCircleCCircle03 03 04 private String color; 04 private String color; 05 private double pi=3.14; 05 private double pi=3.14; 06 private double radius;06 private double radius;07 07 08 public void 08 public void setColor(StringsetColor(String strstr) / ) / 赋值赋值赋值赋值colorcolor的方法的方法的方法的方法09 color=09 col

3、or=strstr; ;10 10 11 public void 11 public void setRadius(doublesetRadius(double r) / r) / 赋值赋值赋值赋值radiusradius的方法的方法的方法的方法12 radius=r;12 radius=r;13 13 14 public void 14 public void setAll(StringsetAll(String strstr, double r) / , double r) / 同时赋值同时赋值同时赋值同时赋值 color color与与与与radiusradius15 color=15

4、color=strstr; ; 16 radius=r;16 radius=r;17 17 18 public void show() / 18 public void show() / 输出半径、颜色与圆面积输出半径、颜色与圆面积输出半径、颜色与圆面积输出半径、颜色与圆面积19 19 System.out.println(colorSystem.out.println(color=+color+, =+color+, Radius=+radius);Radius=+radius);20 20 System.out.println(areaSystem.out.println(area=+pi

5、*radius*radius);=+pi*radius*radius);21 21 22 22 23 23 24 public class app8_124 public class app8_125 25 26 public static void main(String 26 public static void main(String argsargs)27 27 28 28 CCircleCCircle cir1=new cir1=new CCircleCCircle();();29 29 30 cir1.setColor(Red); / 30 cir1.setColor(Red);

6、/ 赋值赋值赋值赋值cir1cir1的的的的colorcolor31 cir1.setRadius(2.0); / 31 cir1.setRadius(2.0); / 赋值赋值赋值赋值cir1cir1的的的的radiusradius32 cir1.show();32 cir1.show();33 33 34 cir1.setAll(Blue,4.0); / 34 cir1.setAll(Blue,4.0); / 同时赋值同时赋值同时赋值同时赋值cir1cir1的的的的colorcolor和和和和radiusradius35 cir1.show(); 35 cir1.show(); 36 36

7、37 37 /* app8-1 OUTPUT-/* app8-1 OUTPUT-color=Red, Radius=2.0color=Red, Radius=2.0area=12.56area=12.56color=Blue, Radius=4.0color=Blue, Radius=4.0area=50.24area=50.24-*/-*/ 下面的例子把app8_1的setColor()、setRadius()与setAll()三个方法用Java重载的特性,以单一方法 setCircle来取代。 从本例可看出,setColor()、setRadius()与setAll()均是在赋值对象的数据

8、成员,这好比是家中分别买了冷气机、暖气机和除湿机一样,不但占空间,且维护上也不方便。Java的重载功能,恰可补足这方面的缺憾。 01 / app8_2, 01 / app8_2, 函数的重载函数的重载函数的重载函数的重载02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04 private String color;04 private String color;05 private double pi=3.14;05 private double pi=3.14;06 private double rad

9、ius;06 private double radius;07 07 08 public void 08 public void setCirclesetCircle(String(String strstr) / ) / 赋值赋值赋值赋值colorcolor成员成员成员成员09 color=09 color=strstr; ;10 10 11 public void 11 public void setCirclesetCircle(double(double r) / r) / 赋值赋值赋值赋值radiusradius成员成员成员成员12 radius=r;12 radius=r;13 1

10、3 14 public void 14 public void setCirclesetCircle(String(String strstr, double r), double r) / / 同时赋值同时赋值同时赋值同时赋值colorcolor与与与与radiusradius15 color=15 color=strstr; ; 16 radius=r;16 radius=r;17 17 18 public void show() 18 public void show() 19 19 System.out.println(colorSystem.out.println(color=+co

11、lor+, =+color+, Radius=+radius);Radius=+radius);20 20 System.out.println(areaSystem.out.println(area=+pi*radius*radius);=+pi*radius*radius);21 21 22 22 2323 24 public class app8_224 public class app8_225 25 26 public static void main(String 26 public static void main(String argsargs)27 27 28 28 CCir

12、cleCCircle cir1=new cir1=new CCircleCCircle();();29 29 30 cir1.30 cir1.setCirclesetCircle(Red); / (Red); / 调用第调用第调用第调用第8 8行的行的行的行的setCirclesetCircle() () 方法方法方法方法31 cir1.31 cir1.setCirclesetCircle(2.0); / (2.0); / 调用第调用第调用第调用第9 9行的行的行的行的setCirclesetCircle() () 方法方法方法方法32 cir1.show();32 cir1.show();3

13、3 33 34 cir1.34 cir1.setCirclesetCircle(Blue,4.0); / (Blue,4.0); / 调用第调用第调用第调用第1414行的行的行的行的setCirclesetCircle() () 方方方方法法法法35 cir1.show(); 35 cir1.show(); 36 36 37 37 /* app8-2 OUTPUT-/* app8-2 OUTPUT-color=Red, Radius=2.0color=Red, Radius=2.0area=12.56area=12.56color=Blue, Radius=4.0color=Blue, Rad

14、ius=4.0area=50.24area=50.24-*/-*/从上例可看出,通过方法的重载,只需有一个方法名称,却可拥有不同的功用,使用起来相当的方便。图8-1 使用重载时,方法会根据参数的个数与类型来调用相对应的方法 8-1-2 使用重载常犯的错误 使用重载时,它的方法是根据参数的个数与类型来调用相对应方法,因此每一个方法的参数个数或参数类型必须不同。参数个数或参数类型完全相同,而只有返回类型不同的不能进行重载。例如,下面的程序代码是行不通的:public void public void setCircle(doublesetCircle(double radius); radius)

15、;public public intint setCircle(doublesetCircle(double radius); radius); 其原因是,一旦调用了setCircle() 方法,则程序无法判断是哪一个方法被调用。事实上,尝试编译这样子的方法,compiler也会出现错误信息 多态使程序简洁,为程序员带来很大便利。在面向对象编程中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。 类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。82

16、 构造函数8-2-1 构造函数的基本认识标识符 类名称(类型1 参数1, 类型2 参数2,.) 程序语句 ; .构造函数的名称必须和类名称相同构造函数没有返回值请注意:构造函数的名称必须与其所属之类的类名称相同 8-2-2 构造函数的调用时机 如前节所述,构造函数除了没有返回值,且名称必须与类的名称相同之外,它的调用时机也与一般的方法不同。一般的方法是在需要用到时才调用,而构造函数则是在创建对象时,便会自动调用,并执行构造函数的内容。因此,构造函数不需从程序直接调用,而是在对象产生时自动执行。以下列简单的例子来说明构造函数的使用:01 / app8_3, 01 / app8_3, 构造函数的使

17、用构造函数的使用构造函数的使用构造函数的使用02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04 private double pi=3.14;04 private double pi=3.14;05 private double radius;05 private double radius;06 06 07 public 07 public CCircleCCircle(double(double r) / r) / 定义构造函数定义构造函数定义构造函数定义构造函数CCircleCCircle() (

18、)08 radius=r;08 radius=r;09 09 10 public void show() 10 public void show() 11 11 System.out.println(radiusSystem.out.println(radius=+radius+, =+radius+, area=+pi*radius*radius); area=+pi*radius*radius);12 12 13 13 14 14 15 public class app8_315 public class app8_31616 17 public static void main(Stri

19、ng 17 public static void main(String argsargs)18 18 19 19 CCircleCCircle cir1=new cir1=new CCircleCCircle(4.0); / (4.0); / 创建对象并调用创建对象并调用创建对象并调用创建对象并调用 CCircleCCircle() ()构造函数构造函数构造函数构造函数20 cir1.show();20 cir1.show();21 21 22 22 /* app8-3 OUTPUT-/* app8-3 OUTPUT-radius=4.0, area=50.24radius=4.0, are

20、a=50.24-*/-*/ 程序第79行定义了构造函数CCircle(),其主要的功用是把radius成员赋值为r (即构造函数所接收的参数)。注意(1)构造函数的名称与类名称相同,都是CCircle。 (2)构造函数CCircle()并没有返回值,即使没有返回值,在定义构造函数还是不能加上void这个字,否则在编译时将出现错误。8-2-3 构造函数的重载 在Java里,不仅方法可以重载,构造函数也可以重载。 在8-1节已经提过,只要方法与方法之间的参数个数不同,或者是类型不同,便可定义多个名称相同的方法,这也就是方法的重载。 再以CCircle为例,下面的程序是从app8_2修改,只是把se

21、tCircle() 方法的重载改为构造函数的重载,如下面的范例:01 / app8_4,01 / app8_4,构造函数的重载构造函数的重载构造函数的重载构造函数的重载02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04 private String color;04 private String color;05 private double pi=3.14;05 private double pi=3.14;06 private double radius;06 private double radi

22、us;07 07 08 public 08 public CCircleCCircle() / () / 没有参数的构造函数没有参数的构造函数没有参数的构造函数没有参数的构造函数09 09 System.out.println(constructorSystem.out.println(constructor CCircleCCircle() called); () called); 10 radius=1.0;10 radius=1.0;11 color=Green;11 color=Green;12 12 13 public 13 public CCircleCCircle(String(

23、String strstr, double r) , double r) / / 有两个变量的构造函数有两个变量的构造函数有两个变量的构造函数有两个变量的构造函数14 14 System.out.println(constructorSystem.out.println(constructor CCircle(String,doubleCCircle(String,double) called); ) called); 15 color=15 color=strstr; ; 16 radius=r;16 radius=r;17 17 18 public void show() 18 publi

24、c void show() 19 19 System.out.println(colorSystem.out.println(color=+color+, Radius=+radius);=+color+, Radius=+radius);20 20 System.out.println(areaSystem.out.println(area=+pi*radius*radius);=+pi*radius*radius);21 21 22 22 23 23 24 public class app8_424 public class app8_425 25 26 public static voi

25、d main(String 26 public static void main(String argsargs)27 27 28 28 CCircleCCircle cir1= cir1=new new CCircleCCircle() (); ;29 cir1.show();29 cir1.show();30 30 31 31 CCircleCCircle cir2= cir2=new CCircle(Blue,4.0)new CCircle(Blue,4.0); ; 32 cir2.show(); 32 cir2.show(); 33 33 34 34 /* app8-4 OUTPUT-

26、/* app8-4 OUTPUT-constructor constructor CCircleCCircle() called() calledcolor=Green, Radius=1.0color=Green, Radius=1.0area=3.14area=3.14constructor constructor CCircle(String,doubleCCircle(String,double) called) calledcolor=Blue, Radius=4.0color=Blue, Radius=4.0area=50.24area=50.24-*/-*/ app8_4共定义了

27、两个不同参数构造函数CCircle()。第一个构造函数CCircle()定义在第811行,它没有任何参数,其作用是把radius成员设为1.0,把color成员设为“Green”。第二个构造函数CCircle(String,double)则定义在第1317行,它可分别接收String和double两个类型的参数,再将成员设为相对应的值。8-2-4 从某一构造函数调用另一构造函数 从某一构造函数内调用另一构造函数,是通过this()这个关键字来调用的,如下面的范例: 01 / app8_5, 01 / app8_5, 从某一构造函数调用另一构造函数从某一构造函数调用另一构造函数从某一构造函数调用

28、另一构造函数从某一构造函数调用另一构造函数02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04 private String color;04 private String color;05 private double pi=3.14;05 private double pi=3.14;06 private double radius;06 private double radius;07 07 08 public 08 public CCircleCCircle() () / / 没有参数的构造函数没

29、有参数的构造函数没有参数的构造函数没有参数的构造函数09 09 this(Green,1.0);this(Green,1.0); 10 10 System.out.println(constructorSystem.out.println(constructor CCircleCCircle() called); () called); 11 11 12 public 12 public CCircleCCircle(String(String strstr, double r) , double r) / / 有参数的构造函数有参数的构造函数有参数的构造函数有参数的构造函数13 13 Sys

30、tem.out.println(constructorSystem.out.println(constructor CCircle(String,doubleCCircle(String,double) called);) called);14 color=14 color=strstr; ; 15 radius=r;15 radius=r;16 16 17 public void show() 17 public void show() 18 18 System.out.println(colorSystem.out.println(color=+color+, =+color+, Radi

31、us=+radius);Radius=+radius);19 19 System.out.println(areaSystem.out.println(area=+pi*radius*radius);=+pi*radius*radius);20 20 21 21 22 22 23 public class app8_523 public class app8_524 24 25 public static void main(String 25 public static void main(String argsargs)26 26 27 27 CCircleCCircle cir1=new

32、 cir1=new CCircleCCircle();();28 cir1.show();28 cir1.show();29 29 30 30 /* app8-5 OUTPUT-/* app8-5 OUTPUT-constructor constructor CCircle(String,doubleCCircle(String,double) called) calledconstructor constructor CCircleCCircle() called() calledcolor=Green, Radius=1.0color=Green, Radius=1.0area=3.14a

33、rea=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 构造函数的

34、公有与私有 方法依实际需要,可设为public与private。相同的,构造函数也有public与private之分。 到目前为止,我们所使用的构造函数均属于public,因此它可以在程序的任何地方被调用,所以新创建的对象均可自动调用它。 如果构造函数被设成private,则无法在该构造函数所在的类以外的地方被调用。如下面的范例: 01 / app8_6, 01 / app8_6, 公有与私有构造函数公有与私有构造函数公有与私有构造函数公有与私有构造函数02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04

35、 private String color;04 private String color;05 private double pi=3.14;05 private double pi=3.14;06 private double radius;06 private double radius;0707 08 08 private private CCircleCCircle() / () / 私有构造函数私有构造函数私有构造函数私有构造函数09 09 System.out.println(privateSystem.out.println(private constructor called

36、); constructor called); 10 10 11 11 public public CCircleCCircle(String(String strstr, double r) / , double r) / 公有构造函数公有构造函数公有构造函数公有构造函数12 12 this();this();13 color=13 color=strstr; ; 14 radius=r;14 radius=r;15 15 16 public void show() 16 public void show() 17 17 System.out.println(colorSystem.out.

37、println(color=+color+, =+color+, Radius=+radius);Radius=+radius);18 18 System.out.println(areaSystem.out.println(area=+pi*radius*radius);=+pi*radius*radius);19 19 20 20 21 21 22 public class app8_622 public class app8_623 23 24 public static void main(String 24 public static void main(String argsarg

38、s)25 25 26 26 CCircleCCircle cir1=new CCircle(Blue,1.0); cir1=new CCircle(Blue,1.0);27 cir1.show();27 cir1.show();28 28 29 29 /* app8-6 OUTPUT-/* app8-6 OUTPUT-private constructor calledprivate constructor calledcolor=Blue, Radius=1.0color=Blue, Radius=1.0area=3.14area=3.14-*/-*/8-2-6 构造函数的省略 在第7章与第

39、8章的8-1节所介绍构造函数之前的程序均没有定义构造函数,依然可以创建新的对象,并正确地运行程序,这是因为如果构造函数省略,Java会自动调用默认的构造函数(default constructor)。默认构造函数的格式如下:public CCircle() / 默认的构造函数注意:默认的构造函数并没有任何的参数,也不做任何事情如果您自行设计了一个没有参数的构造函数,则在创建对象时会调用自行设计的构造函数,而不会调用默认的构造函数。这是Java的覆写(overriding)所致。 8-3 类变量与类方法8-3-1 实例变量与实例方法范例:事例变量与事例方法01 / app8_7, 01 / ap

40、p8_7, 简单的范例简单的范例简单的范例简单的范例, ,实例变量与实例方法实例变量与实例方法实例变量与实例方法实例变量与实例方法02 class 02 class CCircleCCircle / / 定义类定义类定义类定义类CCircleCCircle03 03 04 private double pi=3.14;04 private double pi=3.14;05 private double radius;05 private double radius;06 06 07 07 public public CCircleCCircle(double(double r) / r) /

41、 CCircleCCircle() ()构造函数构造函数构造函数构造函数08 radius=r;08 radius=r;09 09 10 public void show() 10 public void show() 11 11 System.out.println(areaSystem.out.println(area=+pi*radius*radius);=+pi*radius*radius);12 12 13 13 14 14 15 public class app8_715 public class app8_716 16 17 public static void main(Str

42、ing 17 public static void main(String argsargs)18 18 19 19 CCircleCCircle cir1=new CCircle(1.0); cir1=new CCircle(1.0);20 cir1.show();20 cir1.show();21 21 CCircleCCircle cir2=new CCircle(2.0); cir2=new CCircle(2.0);22 cir2.show();22 cir2.show();23 23 24 24 /* app8-7 OUTPUT-/* app8-7 OUTPUT-area=3.14area=3.14area=12.56area=12.56-*/-*/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号