您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 深入类 ch5-2 构造函数 重载
Chapter5深入类主要内容类的多态性或称为函数方法(成员)的重载构造函数类的继承性接口8-1方法的重载(overload)8-1-1重载所谓的“重载”是指相同的方法名称,若参数个数不同,或参数个数相同、类型不同的话,方法便具有不同的功能。范例:01//app8_1,圆形类CCircle,加入字符串类型的color成员02classCCircle//定义类CCircle03{04privateStringcolor;05privatedoublepi=3.14;06privatedoubleradius;0708publicvoidsetColor(Stringstr){//赋值color的方法09color=str;10}11publicvoidsetRadius(doubler){//赋值radius的方法12radius=r;13}14publicvoidsetAll(Stringstr,doubler){//同时赋值color与radius15color=str;16radius=r;17}18publicvoidshow(){//输出半径、颜色与圆面积19System.out.println(color=+color+,Radius=+radius);20System.out.println(area=+pi*radius*radius);21}22}2324publicclassapp8_125{26publicstaticvoidmain(Stringargs[])27{28CCirclecir1=newCCircle();2930cir1.setColor(Red);//赋值cir1的color31cir1.setRadius(2.0);//赋值cir1的radius32cir1.show();3334cir1.setAll(Blue,4.0);//同时赋值cir1的color和radius35cir1.show();36}37}/*app8-1OUTPUT-------color=Red,Radius=2.0area=12.56color=Blue,Radius=4.0area=50.24------------------------*/下面的例子把app8_1的setColor()、setRadius()与setAll()三个方法用Java重载的特性,以单一方法setCircle来取代。从本例可看出,setColor()、setRadius()与setAll()均是在赋值对象的数据成员,这好比是家中分别买了冷气机、暖气机和除湿机一样,不但占空间,且维护上也不方便。Java的重载功能,恰可补足这方面的缺憾。01//app8_2,函数的重载02classCCircle//定义类CCircle03{04privateStringcolor;05privatedoublepi=3.14;06privatedoubleradius;0708publicvoidsetCircle(Stringstr){//赋值color成员09color=str;10}11publicvoidsetCircle(doubler){//赋值radius成员12radius=r;13}14publicvoidsetCircle(Stringstr,doubler){//同时赋值color与radius15color=str;16radius=r;17}18publicvoidshow(){19System.out.println(color=+color+,Radius=+radius);20System.out.println(area=+pi*radius*radius);21}22}2324publicclassapp8_225{26publicstaticvoidmain(Stringargs[])27{28CCirclecir1=newCCircle();2930cir1.setCircle(Red);//调用第8行的setCircle()方法31cir1.setCircle(2.0);//调用第9行的setCircle()方法32cir1.show();3334cir1.setCircle(Blue,4.0);//调用第14行的setCircle()方法35cir1.show();36}37}/*app8-2OUTPUT-------color=Red,Radius=2.0area=12.56color=Blue,Radius=4.0area=50.24------------------------*/从上例可看出,通过方法的重载,只需有一个方法名称,却可拥有不同的功用,使用起来相当的方便。publicvoidsetCircle(Stringstr){color=str;}publicvoidsetCircle(doubler){radius=r;}publicvoidsetCircle(Stringstr,doubler){color=str;radius=r;}classapp8_2{publicstaticvoidmain(Stringargs[]){cir1.setCircle(Red);cir1.setCircle(2.0);cir1.setCircle(Blue,4.0);}}图8-1使用重载时,方法会根据参数的个数与类型来调用相对应的方法8-1-2使用重载常犯的错误使用重载时,它的方法是根据参数的个数与类型来调用相对应方法,因此每一个方法的参数个数或参数类型必须不同。参数个数或参数类型完全相同,而只有返回类型不同的不能进行重载。例如,下面的程序代码是行不通的:publicvoidsetCircle(doubleradius);publicintsetCircle(doubleradius);其原因是,一旦调用了setCircle()方法,则程序无法判断是哪一个方法被调用。事实上,尝试编译这样子的方法,compiler也会出现错误信息多态使程序简洁,为程序员带来很大便利。在面向对象编程中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。8-2构造函数8-2-1构造函数的基本认识标识符类名称(类型1参数1,类型2参数2,...){程序语句;....}构造函数的名称必须和类名称相同构造函数没有返回值请注意:构造函数的名称必须与其所属之类的类名称相同8-2-2构造函数的调用时机如前节所述,构造函数除了没有返回值,且名称必须与类的名称相同之外,它的调用时机也与一般的方法不同。一般的方法是在需要用到时才调用,而构造函数则是在创建对象时,便会自动调用,并执行构造函数的内容。因此,构造函数不需从程序直接调用,而是在对象产生时自动执行。以下列简单的例子来说明构造函数的使用:01//app8_3,构造函数的使用02classCCircle//定义类CCircle03{04privatedoublepi=3.14;05privatedoubleradius;0607publicCCircle(doubler){//定义构造函数CCircle()08radius=r;09}10publicvoidshow(){11System.out.println(radius=+radius+,area=+pi*radius*radius);12}13}1415publicclassapp8_316{17publicstaticvoidmain(Stringargs[])18{19CCirclecir1=newCCircle(4.0);//创建对象并调用CCircle()构造函数20cir1.show();21}22}/*app8-3OUTPUT-------radius=4.0,area=50.24------------------------*/程序第7~9行定义了构造函数CCircle(),其主要的功用是把radius成员赋值为r(即构造函数所接收的参数)。注意(1)构造函数的名称与类名称相同,都是CCircle。(2)构造函数CCircle()并没有返回值,即使没有返回值,在定义构造函数还是不能加上void这个字,否则在编译时将出现错误。8-2-3构造函数的重载在Java里,不仅方法可以重载,构造函数也可以重载。在8-1节已经提过,只要方法与方法之间的参数个数不同,或者是类型不同,便可定义多个名称相同的方法,这也就是方法的重载。再以CCircle为例,下面的程序是从app8_2修改,只是把setCircle()方法的重载改为构造函数的重载,如下面的范例:01//app8_4,构造函数的重载02classCCircle//定义类CCircle03{04privateStringcolor;05privatedoublepi=3.14;06privatedoubleradius;0708publicCCircle(){//没有参数的构造函数09System.out.println(constructorCCircle()called);10radius=1.0;11color=Green;12}13publicCCircle(Stringstr,doubler){//有两个变量的构造函数14System.out.println(constructorCCircle(String,double)called);15color=str;16radius=r;17}18publicvoidshow(){19System.out.println(color=+color+,Radius=+radius);20System.out.println(area=+pi*radius*radius);21}22}2324publicclassapp8_425{26publicstaticvoidmain(Stringargs[])27{28CCirclecir1=newCCircle();29cir1.show();3031CCirclecir2=newCCircle(Blue,4.0);32cir2.show();33}34}/*app8-4OUTPUT-------------------------constructorCCircle()calledcolor=Green,Radius=1.0area=3.14constructorCCircle(String,double)calledcolor=Blue,Radius=4.0area=50.24-------------------------------------------*/app8_4共定义了两个不同参数构造函数CCircle()。第一个构造函数CCircle()定义在第8~11行,它没有任何参数,其作用是把radius成员设为1.0,把color成员设为“Green”。第二个构造函数CCircle(String,double)则定义在第13~17行,它可分别接收String和double两个类型的参数,再将成员设为相对应的值。8-2-4从某一构造函数调用另一构造函数从某一构造函数内调用另一构造函数,是通过this()这个关键字来调用的,如下面的范例:01//app8_5,从某一构造函数调用另一构造函数02classCCircle//定义类CCircle03{04privateStringcolor;05privatedoublepi=3.14;06privatedoubleradius;0708publicCCircle(){//没有参数的构造函数09this(Green,1.0);10System.out.println(constructorCCircle(
本文标题:深入类 ch5-2 构造函数 重载
链接地址:https://www.777doc.com/doc-3199762 .html