您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第5讲 对象的初始化
第五讲对象的初始化本讲主要内容:用构造方法确保初始化方法的重载this关键字对象的初始化过程一、用构造方法确保初始化缺省构造方法javap.exe观察类框架在JDK安装目录下的bin目录下,有一个文件javap.exe,它是一个反编译的类察看器,可用它来观察类框架。如:D:\Javawork\Lesson4javapPerson观察:类框架中多了哪一项?缺省构造方法(续)构造方法的初步认识构造方法的名字和类名相同,无类型修饰,没有返回值;所有类都有构造方法,如果程序中没定义,编译器会自动提供缺省的构造方法;构造方法可带参数,以接收用来初始化的数据。但缺省的构造方法不带参数,不能接收数据,并且方法体为空。主动在类中引入构造方法例:阅读程序,理解构造方法。classFlower{staticintnum=0;//静态变量Flower(){//构造方法num++;System.out.println(num+朵花开了!);}publicstaticvoidmain(String[]args){newFlower();newFlower();newFlower();}}主动在类中引入构造方法(续)思考?1.构造方法有什么用?2.每个类都有构造方法吗?3.构造方法的命名和类型修饰?4.构造方法的执行时机?5.如果希望创建对象时,传递给对象中的变量初值,怎么实现?6.回顾new运算,new类名(参数),其中的参数什么时候带,什么时候不带?7.如果一个类定义了带参的构造方法,可以用new类名()创建该类的对象吗?主动在类中引入构造方法(续)说明构造方法不可声明返回类型(包括void)。如说明编译器将把它看作为一个一般的方法,而不是构造方法。例:classPerson{voidPerson(){//普通方法}}主动在类中引入构造方法(续)练习:构造一个可接受半径Circle类,并含有求圆面积的方法getS和求圆周长的方法getL。通过Circle类的实例化对象,分别求半径为:2、3.5的圆面积和圆周长。classCleverCircle{}classTest{publicstaticvoidmain(String[]args){CleverCirclecc=newCleverCircle(2);System.out.println(cc.getL()+\t\t+cc.getS());cc=newCleverCircle(3.5);System.out.println(cc.getL()+\t\t+cc.getS());}}主动在类中引入构造方法(续)由带参构造方法的类创建对象时,需在类名后附带合适的参数,格式如:new类名(参数)例如:newCleverCircle(2);二、方法的重载构造方法的重载构造方法重载是指一个类中可定义多个构造方法,这样对象初始化就可灵活多样。构造方法重载时,参数必不同,这个不同可以体现在参数的类型或个数上。在具体创建一个对象时,重载的构造方法中,只有一个参数匹配的构造方法得以执行。构造方法的重载(续)例:阅读程序,分析结果,理解构造方法重载。classNewFlower{staticintnum=0;NewFlower(){//①num++;System.out.println(num+朵花开了!);}NewFlower(Stringcolor){//②num++;System.out.println(num+朵花开了........是+color+花!);}publicstaticvoidmain(String[]args){newNewFlower();//无参数,调用①newNewFlower(红);//带参数,调用②newNewFlower(蓝);//带参数,调用②}}构造方法的重载(续)例:构造一个矩形类Rectangle,可接收一个或两个参数作为边长(如果传递过来一个参数,作正方形处理),类中包含求矩形面积的方法。在main方法中求:(1)长2.3,宽4.5矩形面积;(2)边长为7.6的正方形面积。classRectangle{doublew;doubleh;Rectangle(doublex){//正方形,长宽相同w=h=x;}Rectangle(doublex,doubley){//矩形w=x;h=y;}doublegetS(){returnw*h;}}classTest{publicstaticvoidmain(String[]args){System.out.println(newRectangle(2.3,4.5).getS());System.out.println(newRectangle(7.6).getS());}}成员方法的重载重载本身意指同一个类中同一个方法名有多重意义。构造方法可以重载,一般的成员方法也可以重载。成员方法重载的实现是,同一个类中定义了多个同名方法,与重载的构造方法一样,重载的成员方法的参数须是各不相同的。成员方法的重载(续)例:阅读程序,理解成员方法的重载。classTestOL{intx;voidfunc(){System.out.println(noarg);}Stringfunc(inti){returnargis+i;}voidfunc(Strings){System.out.println(s);}publicstaticvoidmain(String[]args){TestOLc=newTestOL();c.func();c.func(c.func(100));}}成员方法的重载(续)成员方法重载的实质是,同一个方法名,被赋予了多个意义。多个同名方法可对应于不同的处理。说明:如果方法的名称和参数一致,而仅仅是返回值类型相异,则无法实现重载。思考:下面哪些方法是重载的?(1)intf(){…}(2)voidf(){…}(3)voidf(inta,intb){…}(4)voidf(Stringc){…}重载时方法的窄化转型如果调用(或自动执行)方法时,传递的实参类型与方法中的形式参数类型不一致,就会采用窄化转型,即传递的实参“小于”方法中声明的形参,实参就会自动提升一级。例:阅读程序,分析程序运行结果。classTestOL{voidfunc(doublex){System.out.println(x+isdouble);}voidfunc(intx){System.out.println(x+isint);}publicstaticvoidmain(String[]a){TestOLc=newTestOL();c.func(1);c.func(2.5);c.func(3.5f);}}重载时方法的窄化转型(续)请思考?(1)重载一个原型为voidfunc(float)的方法会怎样?(2)对voidfunc(intx)整行注释又会怎样?(3)在main方法中末尾加一条c.func(‘a’)会有怎样的输出呢?重载时方法的窄化转型(续)练习:构造一个包含有求累加和方法sum的类MyCal,sum方法可接受一个或两个整型参数,如果是一个参数,则是从自然数1开始的累加;如果是两个参数m和n,求的是从其中较小数到较大数的累加和。三、this关键字this关键字在方法内使用,表示调用方法的这个对象(当前对象)。this.变量名-------访问当前对象的变量this.方法名(参数);----------访问当前对象的方法this(参数);----------调用重载的构造方法this关键字(续)访问对象的成员变量例:阅读程序,理解用this访问对象成员变量的意义。classThisTest{inta;ThisTest(inta){//参数与成员变量同名this.a=a;//成员变量a取得参数值a++;}publicstaticvoidmain(String[]args){System.out.println(newThisTest(5).a);//结果是?}}this关键字(续)访问当前对象的方法classTestB{inta,b;TestB(inta,intb){this.a=a;this.b=b;System.out.println(a+---+b+\t+this.sum());//调用方法}TestB(inta){this(1,a);//调用重载的构造方法}intsum(){ints=0;for(inti=a;i=b;i++)s+=i;returns;}}classTestMe{publicstaticvoidmain(String[]args){newTestB(10,20);newTestB(100);}}this关键字(续)思考?1.方法中的变量与类的成员变量可否同名?2.若同名时,在方法中如何访问成员变量?3.如何在类方法中调用同类中的方法?四、对象的初始化过程类中成员变量的默认值对象的成员变量可赋予初值,如果没有对成员变量预先赋初值,则在创建变量时会自动初始化(默认初值)。其要点是:数值型的成员变量,默认值为0;布尔型的成员变量,默认值为false;引用型的成员变量,默认值为空(null);类中成员变量的默认值(续)例:阅读程序,分析程序运行结果。classTestInitA{intx;Circley;booleanz;publicstaticvoidmain(String[]args){TestInitAti=newTestInitA();System.out.println(xis+ti.x);System.out.println(yis+ti.y);System.out.println(zis+ti.z);}}类中成员变量的默认值(续)但是,方法中的变量是没有默认值的,如果一个变量在方法中定义,那么使用这个变量前必须赋值。classTestInitB{publicstaticvoidmain(String[]args){intx;System.out.println(“\nxis”+x);}}错误:使用未初始化的变量对象初始化过程对象的基本初始化过程初始化时涉及到成员变量和构造方法;实例变量的初始化在构造方法之前。程序一:classTestInitC{intx=3;TestInitC(){x=5;}publicstaticvoidmain(String[]args){TestInitCt=newTestInitC();System.out.println(t.x);}}程序运行结果是3还是5?对象初始化过程(续)程序二:classTestInitD{TestInitD(inta){x=a;}publicstaticvoidmain(String[]args){System.out.println(newTestInitD(5).x);}intx=3;}对象初始化的顺序与类体中实例变量与构造方式定义的先后无关。静态变量的初始化类中的静态成员变量的初始化在第一次创建变量,或直接由类调用时进行。在类实例化对象时,静态变量的初始化首先进行,其后才是实例变量的初始化和构造方法的初始化。无论实例化多少次对象,静态变量都只初始化一次。静态变量的初始化(续)例:阅读程序,分析程序运行结果。classB{B(intm){System.out.println(B(+m+));}}classA{Bb1=newB(1);staticBb2=newB(2);}classTestInitE{publicstaticvoidmain(String[]args){System.out.println(CreatinganAobject.);newA();System.out.println(CreatinganotherAobject.);newA();}}静态变量的初始化(续)思考?1.对象的初始化在什么时候进行?2.静态变量和实例变量的初始化
本文标题:第5讲 对象的初始化
链接地址:https://www.777doc.com/doc-3342857 .html