java面向对象程序设计第六章.ppt
《java面向对象程序设计第六章.ppt》由会员分享,可在线阅读,更多相关《java面向对象程序设计第六章.ppt(99页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java 初级初级第六章面向对象(下)1主要内容:主要内容:lthis与superl构造方法的多态与继承l抽象类l接口l抽象类与接口l引用l类的其他相关内容2this与super3thisthis指代当前对象,主要应用场合:l在一些容易混淆的场合,如成员方法的参数名与数据成员同名;成员方法的局部变量名与数据成员同名。this.数据成员this.成员方法lthis(参数)引用重载的构造方法(见后节)4this例例1publicclassTestinti;publicTest(inti)this.i=i;/与方法参数名相同publicvoidotherMethod()inti=3;this.i=i
2、+2;/与局部变量名相同注意:this.i指的是类定义的属性i,而i指的是局部变量i。5this例例2classFighterPlaneprivateStringname;privateintmissileNum;privateAa;publicFighterPlane(String_name,int_missileNum)this.name=_name;this.missileNum=_missileNum;publicvoidsetA(A_a)if(_a!=null)this.a=_a;publicStringgetName()returnthis.name;classAFighterPl
3、anefp;publicA(FighterPlanefpp)this.fp=fpp;fpp.setA(this);publicvoidinvoke()/发送消息给FighterPlane的对象System.out.println(this.fp.getName();publicclassRunpublicstaticvoidmain(Stringargs)FighterPlaneftp=newFighterPlane(su35,10);Aa=newA(ftp);a.invoke();6supersuper访问当前类的直接父类,主要应用场合:l子类的数据成员或成员方法与父类的数据成员或成员方法名
4、字相同时,当要调用父类的同名方法或同名数据成员时则可用super来指明。super.数据成员super.成员方法(参数)super(参数)/调用父类构造函数7super例例1classAintx=4;inty=1;publicvoidPrintme()System.out.println(x=+x+y=+y);System.out.println(classname:+getClass().getName();publicclassAAextendsAintx;publicvoidPrintme()intz=super.x+6;super.x=5;super.Printme();System.
5、out.println(Iaman+getClass().getName();x=6;System.out.println(z=+z+x=+x+super.x=+super.x+y=+y+super.y=+y);publicstaticvoidmain(Stringarg)intk;Ap1=newA();AAp2=newAA();p1.Printme();p2.Printme();8super例例1运行结果运行结果运行结果如下:x=4y=1classname:Ax=5y=1classname:AAIamanAAz=10 x=6super.x=5y=1super.y=19super例例1讲解讲解
6、l子类和父类定义了同名数据成员,子类继承了父类的x,自己又定义了一个x,则会发生父类数据成员的隐藏。在子类中用的x都是子类自己的,若要使用父类x,则必须用super.x。l子类在覆盖父类方法的同时,调用父类的super.Printme(),这个方法中的成员变量均为父类的成员变量。super.Printme()中的代码虽然调用父类代码,但其中的this指的是子类对象。10Ax=4;y=1VoidPrintme()AAx=4;y=1xVoidPrintme()intz=super.x+6;super.x=5super.Printme();System.out.println(Iaman+this.
7、getClass().getName();。x=4在子类隐藏此处调用的是父类代码及父类中的属性成员。11构造方法的多态与继承12构造方法的多态构造方法的多态构造方法的多态:重载重载和覆盖一个类的若干个重载的构造方法之间可以相互调用。当一个构造方法需要调用另一个构造方法时,可以使用关键字this,同时这个调用语句应该是整个构造方法的第一个可执行语句。使用关键字this来调用同类的其它构造方法,优点同样是以最大限度地提高对已有代码的利用程度,减少程序的维护工作量。13构造方法的多态构造方法的多态例例1classAddClasspublicintx=0,y=0,z=0;AddClass(intx)t
8、his.x=x;AddClass(intx,inty)/调用第一个构造方法this(x);this.y=y;AddClass(intx,inty,intz)/调用第二个构造方法this(x,y);this.z=z;publicintadd()returnx+y+z;publicclassRunAddClasspublicstaticvoidmain(Stringargs)AddClassp1=newAddClass(2,3,5);AddClassp2=newAddClass(10,20);AddClassp3=newAddClass(1);System.out.println(x+y+z=+p
9、1.add();System.out.println(x+y=+p2.add();System.out.println(x=+p3.add();运行结果:x+y+z=10 x+y=30 x=114构造方法的继承构造方法的继承构造方法的继承继承遵循以下的原则:l父类构造方法,子类可以在自己的构造方法中使用super来调用,但必须是子类构造方法的第一个可执行语句。l若子类构造方法中没有显式调用父类构造方法,也没有用this调用重载的其它构造方法,则在产生子类的对象时,系统在调用子类构造方法的同时,默认调用父类无参构造方法。若子类构造方法中显式调用了父类构造方法,或使用了this,则不会默认调用父类
10、无参构造方法。l综上两点:子类构造方法必定调用父类的构造方法。如果不用super调用,必然隐含调用super()。15构造方法的继承构造方法的继承例例1publicclassSonAddClassextendsAddClassinta=0,b=0,c=0;SonAddClass(intx)super(x);a=x+7;SonAddClass(intx,inty)super(x,y);a=x+5;b=y+5;SonAddClass(intx,inty,intz)super(x,y,z);a=x+4;b=y+4;c=z+4;publicintadd()System.out.println(“sup
11、er:+super.add();returna+b+c;publicstaticvoidmain(Stringargs)SonAddClassp1=newSonAddClass(2,3,5);SonAddClassp2=newSonAddClass(10,20);SonAddClassp3=newSonAddClass(1);System.out.println(a+b+c=+p1.add();System.out.println(a+b=+p2.add();System.out.println(a=+p3.add();运行结果如下:super:x+y+z=10a+b+c=22super:x+
12、y+z=30a+b=40super:x+y+z=1a=816构造方法的继承构造方法的继承例例2classPareinti;Pare()i=6;classConstructextendsPareConstruct()Construct(intnum)publicstaticvoidmain(Stringargs)Constructct=newConstruct(9);System.out.println(ct.i);注:如果仅含有带参数的构造方法,没有无参数构造方法,因为本子类Construct自动调用super(),因而程序会出现编译问题。17子类对象实例化的过程子类对象实例化的过程为对象分配
13、内存空间,对成员变量进行默认的初始化成员变量值byte,short,int0long0Lfloat0.0Fdouble0.0DCharu0000booleanfalse所有引用声明NULL注:局部变量必须进行显示初始化。18绑定构造方法,将new中的参数传递给构造方法的形式参数。调用this或super语句(二者必居其一,不能同时存在),有了this,则第四步被省略,但有了super则不省略。进行实例变量的显式初始化操作,如:publicclassAintvalue=4;/显式初始化Bb=newB();/显式初始化,注:B为一另一个类执行当前构造方法的方法体中的程序代码。如果本类是applet
14、,则init()方法在构造方法调用后执行。见下图见下图191产产生生对对象象并并对对对对象象属属性性进行默认初始化进行默认初始化2对对构构造造方方法法中中的的形形式式参参数赋值数赋值3存在存在this吗吗4存在存在super吗吗5对对子子类类中中的的成成员员变变量量进进行显式初始化行显式初始化6执执行行当当前前构构造造方方法法中中的的代码代码子类流程子类流程1Yes子类流程子类流程2父类流程父类流程3YesNoNo345对子类。对子类。6执执行行当当前前构构造造方方法中的代码法中的代码YesNoYesNo345对父类。对父类。6执执行行当当前前构构造造方方法中的代码法中的代码YesNoYesN
15、o对象成员变量初始化流程图20classConstructinti=1;Construct(intnum,inti)this.i=i;publicstaticvoidmain(Stringargs)Constructct=newConstruct(2,3);System.out.println(ct.i);子类对象实例化子类对象实例化例例121classPareinti=3;Pare()classConstructextendsPareinti=8;Construct()Construct(intnum)this();/i=num;intgetSuper()returnsuper.i;publ
16、icstaticvoidmain(Stringargs)Constructct=newConstruct(9);System.out.println(ct.i);System.out.println(ct.getSuper();子类对象实例化子类对象实例化例例222抽象类23抽象类的定义抽象类的定义抽象(抽象(abstract)类)类的概念的概念:用abstract修饰的类称为抽象类,用abstract修饰的成员方法称为抽象方法。l抽象类和具体类的关系就是一般类和特殊类之间的关系,是继承和被继承的关系。l抽象类不能创建对象,创建对象由具体子类来实现,但可以有声明,声明能引用所有具体子类的对象。
17、l抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法。只要有一个抽象方法,类前就必须有abstract修饰。若没有抽象方法,类前也可有abstract修饰。24l对于抽象方法,在抽象类中只指定方法名及类型,而不写实现代码。抽象类必定要派生子类,若派生的子类是具体类,则具体子类中必须实现抽象类中定义的所有抽象方法(覆盖);若子类还是抽象类,如果父类中已有同名abstract方法,则子类中就不能再有同名的抽象方法了。l在抽象类中,非抽象方法可以调用抽象方法。labstract不能与final并列修饰同一个类(产生逻辑矛盾);abstract不能与private,static(因为static修
18、饰的方法必然被直接调用),final或native并列修饰同一个方法;abstract类中不能有private成员这些因为抽象类必然要有子类。25抽象类的一个例子抽象类的一个例子abstractclassShapeabstractdoublearea();/抽象父类classCircleextendsShapeprivateintr;Circle(intr)this.r=r;publicdoublearea()return3.14*r*r;classRectangleextendsShapepublicintwidth,height;Rectangle(intw,inth)width=w;he
19、ight=h;publicdoublearea()returnwidth*height;publicclassShapespublicstaticvoidprint_area(Shapes)doublearea=s.area();System.out.println(s.getClass().getName()+:+area);publicstaticvoidmain(Stringarg)doubleshape_area=0;Shapec1=newCircle(2);Shapec2=newCircle(3);Shaper1=newRectangle(2,3);Shapes1=newShape3
20、;s10=c1;s11=c2;s12=r1;for(inti=0;i对象类抽象类。如:矩形、三角形、圆形类的属性和方法如图:图63(x,y)(x,y)widthheightrxyzwidthheight(x,y)27抽象类的产生过程(抽象类的产生过程(Cont)对以上三类进行抽象:图6428抽象类的产生过程(抽象类的产生过程(Cont)程序:importjava.awt.*;importjava.applet.*;abstractclassShapesprotectedintx,y,k;protecteddoublem;publicShapes(intx,inty,intk,doublem)t
21、his.x=x;this.y=y;this.k=k;this.m=m;abstractpublicdoublegetArea();abstractpublicdoublegetPerimeter();29抽象类的产生过程(抽象类的产生过程(Cont)classCircleextendsShapespublicdoublegetArea()return(m*m*Math.PI);publicdoublegetPerimeter()return(2*Math.PI*m);publicCircle(intx,inty,intwidth)/m充当了半径,k充当了直径super(x,y,width,wi
22、dth/2.0);classRectangleextendsShapespublicdoublegetArea()return(k*m);publicdoublegetPerimeter()return(2*k+2*m);publicRectangle(intx,inty,intwidth,intheight)super(x,y,width,height);30抽象类的产生过程(抽象类的产生过程(Cont)classTriangleextendsShapespublicdoublegetArea()return(Math.sqrt(m*(m-k)*(m-x)*(m-y);publicdoubl
23、egetPerimeter()return(k+x+y);publicTriangle(intbaseA,intbaseB,intbaseC)super(baseA,baseB,baseC,0);/m充当了周长的一半m=(baseA+baseB+baseC)/2.0;31抽象类的产生过程(抽象类的产生过程(Cont)publicclassRunShapeextendsAppletRectanglerect=newRectangle(5,15,25,25);Triangletri=newTriangle(5,5,8);Circlecir=newCircle(5,90,25);publicvoid
24、paint(Graphicsg)/绘制矩形,输出矩形的面积和周长g.drawRect(rect.x,rect.y,rect.k,(int)rect.m);g.drawString(RectArea:+rect.getArea(),50,35);g.drawString(RectPerimeter:+rect.getPerimeter(),50,55);/输出三角形的面积和周长g.drawString(TriangleArea:+tri.getArea(),50,75);g.drawString(TrianglePerimeter:+tri.getPerimeter(),50,95);/绘制圆,
25、输出圆的面积和周长g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k);g.drawString(CircleArea:+cir.getArea(),50,115);g.drawString(CirclePerimeter:+cir.getPerimeter(),50,135);32运行结果:运行结果:33可引用具体子类对象可引用具体子类对象publicclassRunShapeextendsAppletRectanglerect=newRectangle(5,15,25,25);Triangletri=newTriangl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 面向 对象 程序设计 第六
限制150内