面向对象的程序设计.ppt
《面向对象的程序设计.ppt》由会员分享,可在线阅读,更多相关《面向对象的程序设计.ppt(35页珍藏版)》请在冰豆网上搜索。
面向对象程序设计面向对象程序设计本课内容本课内容方法的重载This关键字对象的创建和初始化细节几种常用的Java类Java类的static成员final关键字方法重载方法重载在同一个类中可以定义多个同名方法-方法重载publicclassPrintStreampublicvoidprintln(inti)publicvoidprintln(floatf)publicvoidprintln(Strings)重载方法的参数列表必须不同重载方法的返回值类型可以相同,也可以不同构造方法重载构造方法重载(代码重用代码重用)构造方法重载举例:
publicclassPersonpublicPerson(Stringname,intage,Dated)publicPerson(Stringname,intage)publicPerson(Stringname,Dated)构造方法重载,参数列表必须不同可以在构造方法的第一行第一行使用this()关键字调用其它(重载的)构造方法构造方法重载举例构造方法重载举例importjava.util.Date;publicclassPersonprivateStringname;privateintage;privateDatebirthDate;publicPerson(Stringname,intage,Dated)this.name=name;this.age=age;this.birthDate=d;publicPerson(Stringname,intage)this(name,age,null);publicPerson(Stringname,Dated)this(name,30,d);publicPerson(Stringname)this(name,30);Ex1编写应用程序编写应用程序TestOverride.java测试前页测试前页Person.java中的重载方法中的重载方法构造方法不能构造方法不能继承继承子子类类继继承承父父类类所所有有的的成成员员变变量量和和成成员员方方法,但法,但不继承不继承父类的构造方法父类的构造方法在在一一个个Java类类中中可可以以通通过过两两种种方方式式获获得得构造方法构造方法使用系统默认的无参构造方法使用系统默认的无参构造方法显式定义一个或多个构造方法显式定义一个或多个构造方法一一旦旦显显式式定定义义了了构构造造方方法法,则则系系统统不不再再提供默认构造方法提供默认构造方法子类的构造方法中一定要子类的构造方法中一定要调用调用父类构造方法父类构造方法在在子子类类的的构构造造方方法法中中可可使使用用语语句句super(argument_list)显式调用显式调用父类的构造方法父类的构造方法如如果果子子类类的的构构造造方方法法中中没没有有显显示示地地调调用用父父类类构构造造方方法法,也也没没有有使使用用this关关键键字字调调用用重重载载的的其其它它构构造造方方法法,则则系系统统默默认认调调用用父父类类无参数无参数的构造方法的构造方法如如果果子子类类构构造造方方法法中中既既未未显显式式调调用用父父类类构构造造方方法法,而而父父类类中中又又没没有有无无参参的的构构造造方方法法,则编译出错则编译出错调用父类构造方法举例调用父类构造方法举例publicclassStudentextendsPersonprivateStringschool;publicStudent(Stringname,intage,Strings)super(name,age);school=s;publicStudent(Stringname,Strings)super(name);school=s;publicStudent(Strings)/super();school=s;this/super
(1)thisthis是对是对当前对象的一个引用当前对象的一个引用supersuper是对是对父类的一个引用父类的一个引用什么叫当前对象的一个引用呢?
我们先来看一些例子什么叫当前对象的一个引用呢?
我们先来看一些例子classBoxclassBoxdoublewidth;doubleheight;doubledepth;doublewidth;doubleheight;doubledepth;doublevolume()returnwidth*height*depth;doublevolume()returnwidth*height*depth;voidvoidsetDim(doublesetDim(doublewidth,doubleheight,doubledepth)width,doubleheight,doubledepth)widthwidth=width;=width;heightheight=height;=height;depthdepth=depth;=depth;JavaJava中特殊而且非常有用的引用中特殊而且非常有用的引用this.this.this.this.this.this.按照变量定义域的规则,这种情况下成员变量(蓝)按照变量定义域的规则,这种情况下成员变量(蓝)会被方法中局部变量(红)覆盖掉会被方法中局部变量(红)覆盖掉使用使用thisthis引用后,成员引用后,成员又重新暴露出来了又重新暴露出来了用用thisthis引用解决成员变引用解决成员变量与成员方法的局部变量与成员方法的局部变量名称冲突的问题量名称冲突的问题this
(2)如果我们用下列语句如果我们用下列语句Boxbx1=newBox();Boxbx1=newBox();Boxbx2=newBox();/Boxbx2=newBox();/生成了两个生成了两个BoxBox的对象的对象从外部看前一个对象的引用是从外部看前一个对象的引用是bx1bx1,从,从它的内部看引用则是它的内部看引用则是thisthis同样道理,从外部看第二个对象的引用是同样道理,从外部看第二个对象的引用是bx2bx2,而从而从bx2bx2的内部看的内部看它的引用也是它的引用也是thisthis这就是说,这就是说,在一个对象的内部,如果想得到这个对象的引用,要在一个对象的内部,如果想得到这个对象的引用,要用用thisthis,而不是它的名称而不是它的名称从一个对象的内部看它的父类的对象就是从一个对象的内部看它的父类的对象就是supersuperthis(3)/superthisthis作为输入参数作为输入参数thisthis表示本对象的表示本对象的getValue(AgetValue(Aa)a)调用父类的构造方法调用父类的构造方法调用父类的调用父类的getValuegetValue()()方法方法classAclassAA(intA(intv)value=v;v)value=v;publicpublicintintgetValue(AgetValue(Aa)a)System.out.println(getValueSystem.out.println(getValue(.)ofclassA);(.)ofclassA);returna.value;returna.value;protectedprotectedintintgetValuegetValue()()System.out.println(getValueSystem.out.println(getValue()ofclassA);()ofclassA);returnreturnthis.getValue(thisthis.getValue(this););protectedprotectedintintvalue;value;classBextendsAclassBextendsAB()super(7);B()super(7);publicpublicintintgetValue(BgetValue(Bb)b)System.out.println(getValueSystem.out.println(getValue(.)ofclassB);(.)ofclassB);returnb.value;returnb.value;protectedprotectedintintgetValuegetValue()()System.out.println(getValueSystem.out.println(getValue()ofclassB);()ofclassB);returnreturnsuper.getValuesuper.getValue();();this(4)/更多的例子更多的例子publicclassThisTestDemo1publicclassThisTestDemo1publicstaticvoidmain(Strings)publicstaticvoidmain(Strings)Aa=newA(30);Aa=newA(30);Bb=newB();Bb=newB();System.out.println(a.getValueSystem.out.println(a.getValue();();System.out.println(b.getValueSystem.out.println(b.getValue();();getValuegetValue()ofclassA()ofclassAgetValuegetValue(.)ofclassA(.)ofclassA3030getValuegetValue()ofclassB()ofclassBgetValuegetValue()ofclassA()ofclassAgetValuegetValue(.)ofclassA(.)ofclassA77a.getValuea.getValue()()的调用顺序的调用顺序调用调用aa的的getValuegetValue()()调用调用aa的的getValue(AgetValue(Aa)a)返回返回aa对象的对象的valuevalue值值b.getValueb.getValue()()的调用顺序的调用顺序调用调用bb的的getValuegetValue()()调用调用aa的的getValuegetValue()()调用调用aa的的getValue(AgetValue(Aa)a)返回返回aa对象的对象的valuevalue值值使用使用thisthis引用调用自己的构造方法引用调用自己的构造方法this(5)classBoxclassBox/Box()width=10;height=10;depth=10;Box()width=10;height=10;depth=10;Box()Box()this(10,10,10);this(10,10,10);Box(doublew)Box(doublew)this(w,10,10);this(w,10,10);Box(doublew,doubleh,doubled)Box(doublew,doubleh,doubled)width=w;height=h;depth=dwidth=w;height=h;depth=d;doublevolume()returnwidth*height*depth;doublevolume()returnwidth*height*depth;doublewidth;doubleheight;doubledepth;doublewi