Java面向对象编程进阶.ppt_第1页
Java面向对象编程进阶.ppt_第2页
Java面向对象编程进阶.ppt_第3页
Java面向对象编程进阶.ppt_第4页
Java面向对象编程进阶.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章Java面向对象编程进阶,5.1内部类和匿名类(略)5.2抽象类5.3继承5.4包5.5接口,abstractclassShape/说明一般二维图形抽象类abstractdoublearea();/计算图形面积的方法abstractvoiddraw();/绘制图形的方法,有时,由于对象高级抽象的需要,希望类只需要说明方法首部,而不需要或不可能说明其方法体,其方法体只能由其子类来完成,这样的类需要使用abstract关键字修饰,这种类被称为抽象类。抽象类不能创建任何对象,抽象类只是用来由其子类继承。继承抽象类的子类比它的父类更加具体化、特殊化。例5-1抽象类Shape,5.2抽象类,classRectangleextendsShape/矩型类Rectangle继承了Shape类intwidth;/矩形的宽intlength;/矩形的长punlicdoublearea()returnwidth*length/矩形类实现了Shape类的抽象方法area()publicvoiddraw()/这里要实现Shape类的抽象方法draw(),5.3继承,5.3.1继承概述5.3.2继承语法格式5.3.3子类对父类成员重载5.3.4null,this,super5.3.5多态性5.3.6final类(最终类),在Java编程语言中,通过继承可利用已有的类,并扩展它的属性和方法。这个已有的类可以是语言本身提供的、其他程序员编写的或程序员原来编写的。如果在声明类A时,指明类A继承了类B(类B是一个已定义了的类),则类A通常就拥有了类B的成员变量和方法。此时,类B称为类A的父类(superclass),父类也称为超类或基类;类A称为类B的子类(subclass),子类也称为派生类。Object类是Java中所有类的父类,也就是说Java中的类直接或间接有Object类派生而来。Java中实行单继承,即一个类只能有一个父类。,5.3.1继承概述,一个类只可继承一个父类,但一个类可以有被多个子类继承。因而类之间的关系就形成了所谓的树形层次结构:,类A,类C1n,类C11,类Bm,类B2,类B1,类Cm1,类Cmn,在Java中,java.lang.Object类是Java所有类的父类。,类继承语法形式如下:修饰符classSubClassNameextendsSupperClassNameextends是继承关键词。SubClassName是新的子类名,SupperClassName是继承的父类名。父类名是必需的,而且只能有一个,因为Java中实行单继承。父类名所指定的类必须是在当前编译单元中可以访问的类,否则会产生编译错误。,5.3.2继承语法格式,子类的特性:子类拥有其父类的所有属性和方法。但父类中说明为private的属性和方法,子类不可直接访问。子类可以对父类的方法覆盖或重载。,例.5-2子类与父类,classAprivateinta;protectedintb;publicintc;publicvoidsetA(intaa)a=aa;publicintgetA()returna;classBextendsAintd;publicstaticvoidmain(Stringargs)Bb1=newB();b1.setA(10);b1.b=20;b1.c=30;b1.d=b1.getA()+b1.b+b1.c;System.out.print(b1.d);,子类可以对父类的方法覆盖或重载。方法覆盖:子类的方法首部与父类的方法首部相同,但是子类重新实现了该方法。方法重载:Java中方法可重载,就是方法名相同但形参列表不同之方法。子类的方法对父类的方法也可重载。,5.3.3子类对父类成员重载,如果子类声明了一个与父类的成员变量同名的成员变量,则称父类的该成员变量被隐藏(Hiding),如果子类声明了一个与父类的成员方法同名的成员方法,则称父类的该成员方法被重写(Overriding)。关键字this和super分别用来指明子类和父类中同名的成员变量和方法。当父类的成员变量、子类的成员变量和类的对象方法使用的局部变量三者同名,或其中两个同名时,可以使用关键字this和super来指定所要使用的变量。继承是面向对象编程的主要优点之一,它对如何设计Java类有着直接的影响。继承有如下几点好处:,(1)它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其它的类有什么不同即可,而且还可以动态访问其它有关的类中的信息。(2)通过继承,可以利用Java类库所提供的丰富而有用的类,这些类都已经被很好地实现。(3)当设计很大的程序时,继承可以使程序组织得更加层次清晰,有利于程序设计和减少错误的发生。,例5-3子类与父类的继承关系,publicclassPoint/定义Point类intx;inty;,publicPoint()/构造方法,构造原点(0,0)x=0;y=0;publicPoint(intX,intY)/构造方法,按给定的X、Y值x=X;y=Y;/构成一个点(X,Y)publicdoubledistance()/定义方法,求点到坐标原点的距离returnMath.sqrt(x*x+y*y);/调用Math类的方法sqrt()publicstaticvoiddraw()/类方法draw(),画点System.out.println(Point:apoint.);,classColorPointextendsPointintcolor;publicstaticvoiddraw()/复盖了父类的draw()方法System.out.println(“ColorPoint:acolorpoint.”);classMapPointextendsColorPoint/定义类,继承ColorPoint类/类Object、Point均是MapPoint的父类,但都不是直接父类Stringname;/地图上的点有自己的名字,如城市名publicstaticvoiddraw()/复盖了父类的draw()方法System.out.println(MapPoint:amapcolorpoint.);,publicclassSuperSubpublicstaticvoidmain(Stringargs)Point.draw();ColorPoint.draw();MapPoint.draw();,此程序运行后将输出如下结果:Point:apoint.ColorPoint:acolorpoint.MapPoint:amapcolorpoint.,5.3.4null、this、super,Java语言规范中,每个类均有这样3个对象:null、this、supernull“空”变量,表示这个对象不存在相应的实例例如:Rectanglerect=null;当一个对象不再有用时,应当清除它以释放所占用的内存空间,这只要赋予它null即可。即如:rect=null;,this代表对象本身在类的方法中,如果要引用的变量名或方法名的成员变量名或成员方法名相同,则可通过使用this来代表对象本身,即引用对象自身。super代表父类当子类中有与父类同名的变量或方法时,可加上super限定词来指明是对父类的变量或方法的引用。下面是this和super是使用的例子。,classRectangleintwidth,length;Rectangle(intwidth,intlength)/构造方法this.width=width;/this代表所创建的对象this.length=length;publicvoiddrawRect()System.out.println(thisisRectangle!);,例5-4用this表示引用自身,上面这个例子中,用this表示引用对象本身。,在构造方法中,可以使用super来引用父类的构造方法。例5-5用super引用父类的构造方法,classfillRectangleextendsRectanglepublicfillRectangle(intw,intnum)/构造方法super(w,num);/调用父类的构造方法privateStringmakeString(charch,intnum)StringBufferstr=newStringBuffer();for(inti=num;i0;i-)str.append(ch);returnstr.toString();,在这个类的构造方法中并没有写新的程序,而是调用了父类的构造函数,用于初始化实例变量。,publicvoiddrawRect()for(inti=length;i0;i-)/用字符“#”绘制(填满)一个矩形System.out.pringln(makeString(#,width);,例.5-6用super指明引用父类的变量,classAStringstr=aaaaa;classBextendsAStringstr=bbbbb;voidf()System.out.println(父类变量str:+super.str);System.out.println(子类变量str:+str);publicstaticvoidmain(Stringargs)Bb1=newB();b1.f();,例.5-7对象变量、静态变量的继承。,classAstaticinta;intb;classBextendsApublicstaticvoidmain(Stringargs)A.a=10;B.a=20;System.out.println(A.a=+A.a+,B.a=+B.a);Aa1=newA();Bb1=newB(),b2=newB();a1.b=3;b1.b=4;b2.b=5;System.out.println(a1.b);System.out.println(b1.b);System.out.println(b2.b);,final修饰符可以定义一个不能被继承的类,即不能再有子类。java.lang.System类就是final类的一个例子,它是最终的类。final修饰符通常是出于安全的目的而使用的,因为不能继承final类,人们就不能重载或覆盖它的任何方法。如果允许一个类被继承,其被重载或覆盖的方法可能会被改写。保证某个特定的方法在类层次关系上的某层以后只有一个定义,这对于那些安全性非常关键的类是非常必要的。无论是用于修饰变量、方法还是类,final关键字的目的都是一样的:增强代码的安全性。例4.8final类说明finalclassEndClassextendsSupperClass,5.3.5final类(最终类),5.4.1包说明5.4.2包的层次结构5.4.3包的使用,5.4包,包是为了解决设计较大规模的程序而引入的概念。一个大的系统,往往包含多种对象,需要多个类来描述。这些类以逻辑方式组合在一起,形成了所谓的包。使用包可提供控制访问的范围。类、方法缺省访问权限时,就只可在它所属的包中被访问,说明为public的才可在其他包中被访问。一个Java程序可以由多个包组成。一个包可由一个或多个源程序文件(.java文件)构成,有多个源程序文件时要分别建立。注意:每个源程序文件中最多只能有一个说明为public的类。,包说明语句总是源程序文件中的第一个语句(可省略),其格式如下:package包名;例.5-8包说明上面的程序定义了一个包含3个类的包。,5.4.1包说明,packageSamplePackage;publicclassClass1classClass2classClass3,包中多个类之间不可嵌套定义,但前后位置无关。,在Java中,包采用如下的层次结构:子包类文件和接口文件(一个类或一个接口编译后都产生一个相应的字节码文件)由于包的层次结构类似文件夹的层次结构,所以,为了实现上的简单,Java对包的存储作了一定的规定。系统中所有的Java包、类的源文件、字节码文件都必须存放在单一文件夹下或它的子文件夹中。在实际的Java开发环境中,通常提供了一个名为CLASSPATH的环境变量,这个环境变量中包含了一系列的路径名,它们就是存储Java类、接口和包的路径。系统将按照环境变量CLASSPATH中路径出现的先后顺序逐个搜索,来寻找某个类、接口或包。以下是一个Windows环境变量的例子:CLASSPATH=C:JDKlib;C:JDKsrc;,5.4.2包的层次结构,1.用户自己定义的包的使用例5-9包的使用,5.4.3包的使用,/文件:packoneClassBeUsed.javapackagepackone;/定义包packonepublicclassClassBeUsedprivateintcounts;ClassBeUsed()/无参构造方法setcounts(0);ClassBeUsed(inti)/有参构造方法setcounts(i);protectedvoidsetcounts(inti)counts=i;publicintgetcounts()returncounts;,上面的程序中创建了两个包packone和packtwo。在packone包中定义了一个public类classBeUsed,在packtwo包中定义了一个public类UsingClass。,/文件:packtwoUsingClass.javapackagepacktwo;/定义包packtwopublicclassUsingClasspublicstaticvoidmain(Stringargs)ClassBeUsedcb=newClassBeUsed(2);/创建包packone的ClassBeUsed类的实例cbSystem.out.println(cb.getcounts();,packtwo的UsingClass类的main方法中的语句:ClassBeUsedcb=newClassBeUsed(2);是要创建包packone的ClassBeUsed类的实例cb。,编译里例5-9中的程序,则会产生如下的错误:UndefinednameClassBeUsedCannotfinddefinitionforclassClassBeUsed原因何在?仔细地观察程序:,packagepackone;publicclassClassBeUsedprivateintcounts;ClassBeUsed()/无参构造方法setcounts(0);ClassBeUsed(inti)/有参构造方法packagepacktwo;publicclassUsingClasspublicstaticvoidmain(Stringargs)ClassBeUsedcb=newClassBeUsed(2);System.out.println(cb.getcounts();,/文件:packoneClassBeUsed.javapackagepackone;publicclassClassBeUsedprivateintcounts;publicClassBeUsed()/构造方法声明为publicsetcounts(0);publicClassBeUsed(inti)/构造方法声明为publicsetcounts(i);,现在对例5-9程序做一些修改,改正后的程序如下:,/文件:packtwoUsingClass.javapackagepacktwo;importpackone.ClassBeUsed;/引入包packtwo的类ClassBeUsedpublicclassUsingClasspublicstaticvoidmain(Stringargs)ClassBeUsedcb=newClassBeUsed(2);System.out.println(cb.getcounts();,/文件:packtwoUsingClass.Javapackagepacktwo;publicclassUsingClasspublicstaticvoidmain(Stringargs)packone.ClassBeUsedcb=newpackone.ClassBeUsed(2);System.out.println(cb.getcounts();,也可如下修改:,2.系统包的使用Java系统中建立了很多非常有用的包,供用户使用。这些包以“java.”开头,作为java的一个标准部分发布的。其使用方法与用户自定义的包一样,只需要在程序开始处(包定义语句后)加上import语句引入所需包中的类即可。其格式如下:import包名.类名;或:import包名.*;学习Java,必须学习Java常用包中的类。从第六章开始,将叫详细地介绍Java常用包的使用。,引入某包的一个类,引入某包的所有类,一个Java程序可以由多个包组成。如果想使一个类能被其它包引用,那么该类必须是由public修饰的类(公共类),其构造方法也必须声明为public。要创建一个非本包的公共类的实例时,可以使用两种方法:(1)在类名前带上包名加以限定(2)在程序头部(包定义语句后)使用import语句引入所需包中的类。,包小结,5.5接口,5.5.1接口的概念5.5.2接口的说明5.5.3接口的使用,类体的结构:一个类的类体由一些成员变量和一些成员方法组成。如果一个类的类体中仅含有final修饰的成员变量(即常量)和一些抽象的成员方法(方法框架,即方法体只是个分号),则这样的类就改叫做接口(interface),而不再叫做类,即接口就是一些常量和抽象方法的定义的集合,它是一个设计框架。接口中的方法只是一个定义框架而没有具体的实现代码,所以接口是不能象类一样建立实例,而只能再用类来实现接口中的方法,然后我们再引用这样的类。,5.5.1接口的概念,接口是面向对象的一个重要思想,利用接口的“设计与实现分离”的特性,使利用接口的程序不受不同接口实现的影响,不受接口实现改变的影响。软件设计者在设计程序时,也许只想设计一个框架,如只提供一个类的抽象的接口,而不希望去具体实现它。使用接口就可以很完美地解决这个问题。,接口可以继承和类不同,一个接口可以继承多个其它的接口,也就是说,接口是支持多继承的。接口中的方法要用类来实现一个类说明实现一个接口,就是承诺它将实现接口中声明的所有方法。一个类可以实现多个接口一个接口也可以被多个类实现接口可以多继承,即一个接口可以有多个父接口,但和类的继承不同,子接口只是从父接口那里继承了方法的说明,而不会有方法的实现和实例变量的说明。这样,就降低了完全多继承所带来的复杂性。,小结:接口和类之间的区别(1)类只能单继承,而接口可以多继承。(2)类中的方法可以是具体的,也可以抽象的。接口中的方法都是抽象的。(3)接口中的方法要用类来实现,一个类可以实现一个接口,也可以实现多个接口。(4)对于继承性,子类可以直接继承父类的方法,也可以覆盖父类的方法。而子接口仅从父接口那里继承了方法的说明,并没有方法的实现。因此,任需要用类来实现子接口中的所有方法。,5.5.2接口的说明,接口类型的说明类似于类的说明,它由两部分组成:接口说明和接口体。接口首说明接口体像类一样,编译好的接口保存在Class文件中。,接口首说明的形式如下:修饰符interface接口名extends接口序列interface是关键字,表示定义接口。修饰符是可选的。当没有修饰符的时候,表示此接口的访问只限于同包的类。如果使用修饰符,则只能用public修饰符,表示此接口是公有的,在任何地方都有可以引用它,这一点和类是相同的。接口说明中的extedns关键词和类说明中的extends一样,用来定义直接的父接口,当extends后面有多个父接口时,它们之间用逗号隔开。一个最简单的接口说明:publicinterfaceCookableextendsFoodable,Printable接口体,接口首说明,接口体说明接口的成员常量和抽象方法。/接口体开始常量说明抽象方法说明/接口体结束例.5-10接口说明,接口体,interfaceCountablefinalintMALMUM=50;/定义一个常量voidincrementCount();/定义一个无参的抽象方法voiddecrementCount();/定义第二个抽象方法intcurrentCount();/定义第三个抽象方法intsetcount(intnewcount);/定义第四个抽象方法,有参数,接口体说明注意点:(1)接口中的成员变量(常量)说明声明形式:修饰符类型名变量名;接口中的成员变量的修饰符都只能用public、static、final,而且也都隐含着修饰符,所以修饰符是不必写的。就是说,接口中的成员变量都是公用的静态最终变量,即公用的静态常量。例如:在接口中,下面这行代码:intSTEP=5;等同于:publicstaticfinalintSTEP=5;(2)接口中的方法接口中说明的方法都是抽象方法,其声明

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论