面向对象高级程序设计_第1页
面向对象高级程序设计_第2页
面向对象高级程序设计_第3页
面向对象高级程序设计_第4页
面向对象高级程序设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、九江学院信息科学与技术学院软件教研室 王飞鹏http:/ 当我们在子类中定义的成员变量和父类中的成员变量同名时,此时称子类的成员变量隐藏了父类的成员变量。当子类中定义了一个方法,并且这个方法的名字,返回类型,参数个数以及类型和父类的某个方法完全相同时,父类的这个方法将被隐藏,这时我们说重写了父类的方法。 子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。http:/ SuperClass /父类 int y; void setY() y=0; class SubClass extends SuperClass int y; / 父类变量y被隐藏 void setY

2、() / 重写父类的方法setY() y=1; http:/ 子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。我们知道,this用来引用当前对象,与this类似,super用来引用当前对象的父类。 super的使用可以分为下面三种情况: 1)用来访问父类被隐藏的成员变量,如: super.variable 2)用来调用父类中被重写的方法,如: super.Method(paramlist) 3)用来调用父类的构造方法,如

3、: super(paramlist)http:/ A /类A public int n; /公共类型的成员变量 public A() public A(int n) this.n = n; int method() return n; public class B extends A /类B public B() super(15); public static void main(String args) A aInstance = new B( ); int b=aInstance.method(); System.out.println(类A中的成员变量:+b); http:/ 类是B

4、类的父类, class b extends B当我们用子类创建一个对象,并把这个对象的引用放到父类的对象中时,例如 A a; A a=new B(); 或 A a; B b=new B(); a=b;称这个父类对象a,是子类对象b的上转型对象。 http:/ 对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能.上转型对象具有如下特点: 1)上转型对象不能操作子类新增的成员变量和子类新增的方法。 2)上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。 3)如果子类重写了父类的某个方法后,当对象的上转对象调用这个方法时一定是调用了这个重写的

5、方法,因为程序在运行时知道,这个上转对象的实体是子类创建的,只不过损失了一些功能而已。 不要将父类创建的对象和子类对象的上转型对象相混淆。 上转型对象在Java编程中是常见的。 可以将对象的上转型对象再强制转换到一个子类对象可以将对象的上转型对象再强制转换到一个子类对象,这时这时,该子类对象又具备了子类所给的所有属性和功能。该子类对象又具备了子类所给的所有属性和功能。 http:/ Mammal /哺乳动物类 private int n=40; void crySpeak(String s) System.out.println(s); public class Monkey extends

6、Mammal / 猴子类 void (int aa,int bb) int cc=aa*bb; System.out.println(cc); void crySpeak(String s) System.out.println(*+s+*); public static void main(String args) Mammal mammal=new Monkey(); / mammal是Monkey类的对象的上转型对象. mammal.crySpeak(I love this game); / puter(10,10); Monkey monkey=(Monkey)mammal; /把上转

7、型对象强制转化为子类的对象. puter(10,10); http:/ love this game*100在上述例子中,上转对象mammal调用方法:mammal.crySpeak(I love this game);得到的结果是”*I love this game*”.而不是”I love this game”。因为mammal调用的是子类重写的方法crySpeak.在main()中,如果出现下面的两行代码,那将是错误的:mammal.n=1000; /因为子类本来就没有继承n。 puter(10,10); /因为computer方法是子类新增的方法。http:/ 在Java语言中,多态性

8、主要体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态),如下:1) 编译时多态在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。2) 运行时多态由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。 如果子类重写了父类的方法,那么重写方法的调用原则如下:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子

9、类继承了父类的方法(未重写),则运行时系统调用父类的方法。 另外,方法重写时应遵循的原则如下:改写后的方法不能比被重写的方法有更严格的访问权限。改写后的方法不能比被重写的方法有更严格的访问权限。改写后的方法不能比被重写的方法产生更多的异常改写后的方法不能比被重写的方法产生更多的异常。 进行方法重写时必须遵从这两个原则,否则编译器会指出程序出错。http:/ Parentpublic void function() System.out.println(I am in Parent!);class Child extends Parentprivate void function()System

10、.out.println(I am in Child!);public class RTpolyTest public static void main(String args) Parent pl=new Parent( ); Parent p2=new Child( ); p1.function( ); p2.function( ); http:/ RTpolyTest.javaRTpolyTest.java:8: function() in Child cannot override function() in Parent; attempting to assign weaker ac

11、cess privileges; was public private void function() RTpolyTest.java:16: cannot find symbolsymbol : variable p1location: class RTpolyTest p1.function( ); 2 errors可以看出,该程序中实例p2调用function()方法时会导致访问权限的冲突。 http:/ Java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类。一个abstract 类只关心它的子类是否具有某种功能,并不关心该功能的具体实现,功能的具体行为由子类负责实现

12、的。例如: public abstract class Drawing public abstract void drawDot(int x, int y); public void drawLine(int x1, int y1,int x2, int y2) 用abstract来修饰一个方法时,该方法叫做抽象方法。与final类和方法相反,abstract类必须被继承,abstract方法必须被重写。 http:/ 当一个类的定义完全表示抽象的概念时,它不应该被实例化为一个对象。例如Java中的Number类就是一个抽象类,它只表示数字这一抽象概念,只有当它作为整数类Integer或实数类

13、Float等的父类时才有意义。定义一个抽象类的格式如下: abstract class abstractClass 由于抽象类不能被实例化,因此下面的语句会产生编译错误: new abstractClass(); 抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,对抽象方法只需声明,而不需实现,因此它没有方法体。其格式如下: abstrac returnType abstractMethod(paramlist); http:/ class AAabstract void callme( );void metoo( )System.out.println(InsideAs metoo()

14、 method);class BB extends AAvoid callme( )System.out.println(Inside Bs callme() method);public class AAbstractpublic static void main(String args)AA cc=new BB(); /cc为上转型对象cc.callme();cc.metoo(); http:/ 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。通过接口使得处于不同层次,甚至互不相关的类可以具有相同的行为。接口其实就是方法定义和常量值的集合。

15、它的优点主要体现在下面几个方面:(1)通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。(2)通过接口可以指明多个类需要实现的方法。(3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。 接口把方法的定义和类的层次区分开来,通过它可以在运行时动态地定位所调用的方法。同时接口中可以实现“多重继承”,且一个类可以实现多个接口。正是这些机制使得接口提供了比多重继承(如C+等语言)更简单、更灵活、而且更强劲的功能。 http:/ Java 不支持多继承性,即一个类只能有一个父类。单继承性使得Java类层次简单,易于程序的管理。为了克服单继承的缺点,Java使用了接口,一个

16、类可以实现多个接口。使用关键字interface 来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体两部分。1、 接口声明接口声明 我们曾使用class关键字来声明类,接口通过使用关键自interface 来声明. 完整的接口定义格式如下:public interface interfaceName extends listOfSuperInterface 其中public修饰符指明任意类均可以使用这个接口,缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个

17、类只能有一个父类。子接口继承父接口中所有的常量和方法。 通常接口名称以able或ible结尾,表明接口能完成一定的行为,例如Runnable、Serializable。http:/ 接口体接口体 接口体中包含常量定义和方法定义两部分。其中常量定义部分定义的常量均具有public、static和final属性。其格式如下: returnType methodName(paramlist); 接口中只能进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号(;)结尾,在接口中声明的方法具有public和abstract属性。另外,如果在子接口中定义了和父接口同名的常量,则父接口中的

18、常量被隐藏。例如:interface Summaryable final int MAX=50; / MAX具有public、static、final属性void printone(float x);float sum(float x ,float y); 上面这段程序可以以Summaryable.java来保存,也可以写入其它Java程序中。http:/ 一个类通过使用关键字implements 声明自己使用(或实现)一个或多个接口。如果使用多个接口,用逗号隔开接口名。如 class Calculate extends Computer implements Summary,Substrac

19、table 类Calculate使用了Summary 和Substractable接口,继承了Computer类。如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。需要注意的如下: 1)在类中实现接口的方法时,方法的名字,返回类型,参数个数及类型必须与接口中的完全一致。 2)接口中的方法被默认是public ,所以类在实现接口方法时,一定要用public 来修饰。 3)另外,如果接口的方法的返回类型如果不是void 的,那么在类中实现该接口方法时,方法体至少要有一个return 语句。如果是void 型,类体除了两个大括号外,也可以没有任何语句.http:/

20、 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。通过接口使得处于不同层次,甚至互不相关的类可以具有相同的行为。接口其实就是方法定义和常量值的集合。 它的优点主要体现在下面几个方面: (1)通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。 (2)通过接口可以指明多个类需要实现的方法。 (3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。接口把方法的定义和类的层次区分开来,通过它可以在运行时动态地定位所调用的方法。同时接口中可以实现“多重继承”,且一个类可以实现多个接口。正是这些机制使得接口提供了比多重继承(如C+

21、等语言)更简单、更灵活、而且更强劲的功能。http:/ MultInterfaces.javainterface I1 abstract void test(int i); interface I2 abstract void test(String s); public class MultInterfaces implements I1, I2 public void test(int i) System.out.println(In MultInterfaces.I1.test);public void test(String s) System.out.println(In MultInterfaces.I2.test); public static void main(String a) MultInterfaces t = new MultInterfaces(); t.test(42); t.test(Hello); http:/ 简单地说,一个类被嵌套定义于另一个类中,称为嵌套

温馨提示

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

评论

0/150

提交评论