Java语言程序设计基础教程(继承、接口和内部类)ppt.ppt_第1页
Java语言程序设计基础教程(继承、接口和内部类)ppt.ppt_第2页
Java语言程序设计基础教程(继承、接口和内部类)ppt.ppt_第3页
Java语言程序设计基础教程(继承、接口和内部类)ppt.ppt_第4页
Java语言程序设计基础教程(继承、接口和内部类)ppt.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4章继承、接口和内部类章继承、接口和内部类 n继承、超类和子类继承、超类和子类 n抽象类和接口抽象类和接口 n内部类内部类 nClass类类 4.1继承、超类和子类 n继承是面向对象编程技术的一块基石,是一种由已有 的类创建新类的机制。运用继承,可以先创建一个通 用类,它定义了一系列相关属性的一般特性。该类可 以被更具体的类继承,每个具体的类都增加一些自己 特有的东西。在Java术语学中,被继承的类叫超类 (superclass),继承超类的类叫子类(subclass)。 子类不能继承父类中访问权限为private的成员变量和 方法。子类可以重写父类的方法,及命名与父类同名 的成员变量。J

2、ava不支持多重继承,即一个类从多个 超类派生的能力。 n通过继承实现代码复用。Java 中所有的类都是通过 直接或间接地继承java.lang.Object类得到的。 4.1.1子类 n继承一个类,只要用extends关键字把一个类 的定义合并到另一个中就可以了。创建子类的 一般格式为: qclass SubClass extends SuperClass q q n例如: qclass Students extends People q q 4.1.2子类的继承 n子类通过隐藏父类的成员变量和重写父类的方 法,可以把父类的状态和行为改变为自身的状 态和行为。例如: qclass Super

3、Class qint x; qvoid setX( ) qx=0; q q qclass SubClass extends SuperClass qint x; /隐藏了父类的变量x q qvoid setX( ) /重写了父类的方法 setX() qx=5; q q n注意注意:子类中重写的方法和父类中被重写的方 法要具有相同的名字,相同的参数表和相同的 返回类型,只是函数体不同。 【例4-1】 一个关于继承的简单例子。 n/Create a superclass. nclass SA nint i, j; nvoid showij() nSystem.out.println(i and j

4、: + i + + j); n n n/ Create a subclass by extending class A. nclass SB extends A nint k; nvoid showk() nSystem.out.println(k: + k); n nvoid sum() nSystem.out.println(i+j+k: + (i + j + k); n n nclass SimpleInheritance npublic static void main(String args) nSA superOb = new SA(); nSB subOb = new SB();

5、 n/ The superclass may be used by itself. nsuperOb.i = 10; nsuperOb.j = 20; nSystem.out.println(Contents of superOb: ); nsuperOb.showij(); nSystem.out.println(); n/ The subclass has Access to all public members of its superclass. nsubOb.i = 7; nsubOb.j = 8; nsubOb.k = 9; nSystem.out.println(Contents

6、 of subOb: ); nsubOb.showij(); nsubOb.showk(); nSystem.out.println(); nSystem.out.println(Sum of i, j and k in subOb:); nsubOb.sum(); n n 4.1.3 super关键字 n与类中this关键字相似,Java语言中使用关键 字super表示父类对象。通过在子类中使用 super做前缀可以引用被子类隐藏的父类变量 或被子类重写的父类方法。super用来引用当 前对象的父类,虽然构造方法不能够继承,但 利用super关键字,子类构造方法中也可以调 用父类的构造方法。

7、 nSuper 的使用有2种情况: 1操作被隐藏的变量和方法操作被隐藏的变量和方法 n访问父类被隐藏的成员变量,一般格式为: nsuper.variable; n调用父类中被重写的方法,一般格式为: nsuper.Method(paramlist); n假如成员变量x和方法y()分别是被子类隐藏的 父类的变量和方法,则: nsuper.x /表示父类的成员变量x nsuper.y() /表示父类的成员方法y() 【例4-2】利用supers操作父类被隐藏 和重写的变量和方法。 nclass ep4_2_a nint n; nfloat f() nfloat sum = 0; nfor (int

8、 i = 1; i = n; i+) nsum = sum + i; n nreturn sum; n n nclass ep4_2_b extends ep4_2_a nint n; nfloat f() nfloat c; nsuper.n = n; nc = super.f(); nreturn c / n; n nfloat g() nfloat c; nc = super.f(); nreturn c / 2; n n nclass ep4_2 npublic static void main(String args) nep4_2_b aver = new ep4_2_b(); n

9、aver.n = 100; nSystem.out.println(result_one= + aver.f(); nSystem.out.println(result_two= + aver.g(); n n 2使用使用super调用父类的构造方法调用父类的构造方法 n子类不能继承父类的构造方法,若子类想使用 父类的构造方法,必须在子类的构造方法中利 用super来调用,且super必须是子类构造方法 中的第一条语句。 n调用父类的构造函数,一般格式为: nsuper(paramlist); 【例4-3】利用supers操作父类的构造 方法。 nclass ep4_3_student nin

10、t num; nString name; nep4_3_student(int num, String name) nthis.num = num; = name; nSystem.out.println(姓名: + name + n 学号: + num); n n nclass ep4_3_univer extends ep4_3_student nboolean 婚否; nep4_3_univer(int num, String name, boolean b) nsuper(num, name); n婚否 = b; nSystem.out.println(婚否: +

11、 婚否); n n nclass ep4_3 npublic static void main(String args) nep4_3_univer student_one = new ep4_3_univer(1234, 小强, false); n n n程序的运行结果如下所示: n需要注意的是,若子类调用父类的构造方法,在子类的构造方法 中省略掉super关键字,则系统默认有“super()”,即调用父类不 带参数的构造方法。由于Java语言规定如果一个类中含有一个或 多个构造方法,系统不提供默认的构造方法(不含参数的构造方 法),所以当在父类中定义了多个构造方法时,应考虑包括一个 不带参

12、数的构造方法,以防止子类省略super关键字时出现错误。 4.2抽象类和接口 nJava语言中,用abstract 关键字来修饰一个类 时,这个类叫做抽象类,用abstract 关键字来 修饰一个方法时,这个方法叫做抽象方法。格 式如下: qabstract class abstractClass /抽象类 qabstract returnType abstractMethod(paramlist) / 抽象方法 4.2.1抽象类 n抽象类就是不能使用new方法进行实例化的类,即没 有具体实例对象的类。抽象类有点类似“模板”的作 用,目的是根据其格式来创建和修改新的类。对象不 能由抽象类直接创

13、建,只可以通过抽象类派生出新的 子类,再由其子类来创建对象。 n在抽象类中的成员方法可以包括一般方法和抽象方法。 抽象方法就是以abstract修饰的方法,这种方法只声 明返回的数据类型、方法名称和所需的参数,没有方 法体,也就是说抽象方法只需要声明而不需要实现。 当一个方法为抽象方法时,意味着这个方法必须被子 类的方法所重写,否则其子类的方法仍然是abstract 的。 n抽象类中不一定包含抽象方法,但是包含抽象方法的 类一定要被声明为抽象类。抽象类本身不具备实际的 功能,只能用于派生其子类,而定义为抽象的方法必 须在子类派生时被重写。抽象类中可以包含构造方法, 但是构造方法不能被声明为抽象

14、。一般来说,由于不 能够用抽象类直接创建对象,因此在抽象类内定义构 造方法是多余的。 n需要注意的是: q抽象类不能用final来修饰,即一个类不能既是最终类又是抽 象类。 qabstract不能与private、static、final、native并列修饰同一 个方法。 【例4-5】定义抽象类Animal,从抽象类派生子类Horse和Dog, 实现父类的抽象方法。 nabstract class ep4_5_Animal / 定义抽象类 nString str; nep4_5_Animal(String s) / 定义抽象类的 一般方法 nstr = s; n nabstract void

15、 eat(); / 定义抽象方法 n nclass ep4_5_Horse extends ep4_5_Animal / 定义 继承Animal的子类 nString str; nep4_5_Horse(String s) nsuper(s); / 调用父类的构造方法 n nvoid eat() / 重写父类的抽象方法 nSystem.out.println(马吃草料!); n n nclass ep4_5_Dog extends ep4_5_Animal nString str; nep4_5_Dog(String s) nsuper(s); n nvoid eat() nSystem.ou

16、t.println(狗吃骨头!); n n nclass ep4_5 npublic static void main(String args) nep4_5_Horse Horse1 = new ep4_5_Horse(马); nep4_5_Dog Dog1 = new ep4_5_Dog(狗); nHorse1.eat(); nDog1.eat(); n n 4.2.2接口 n接口是抽象类的一种,只包含常量和方法的定 义,而没有变量和方法的实现,且其方法都是 抽象方法。它的用处体现在下面几个方面: q通过接口实现不相关类的相同行为,而无需考虑这 些类之间的关系。 q通过接口指明多个类需要实

17、现的方法。 q通过接口了解对象的交互界面,而无需了解对象所 对应的类。 4.2.3接口的定义 n接口的定义包括接口声明和接口体。 n接口声明的格式如下: npublic interface interfaceNameextends listOfSuperInterface n n nextends 子句与类声明的extends子句基本相 同,不同的是一个接口可有多个父接口,用逗 号隔开,而一个类只能有一个父类。 n接口体包括常量定义和方法定义,常量定义格 式为: ntype NAME=value; n该常量被实现该接口的多个类共享;具有 public,final,static的属性。 n方法体

18、定义格式为:(具有 public和abstract属 性) nreturnType methodName(paramlist); 4.2.4接口的实现 n在类的声明中用implements子句来表示一个类 使用某个接口,在类体中可以使用接口中定义 的常量,而且必须实现接口中定义的所有方法。 一个类可以实现多个接口,在implements子句 中用逗号分开。 【例4-6】一个接口实现的例子。 ninterface ep4_6_a / 定义第1个接口 ndouble pi = 3.14; nabstract double area(); n ninterface ep4_6_b / 定义第2个接口

19、 nabstract void setColor(String c); n ninterface ep4_6_c extends ep4_6_a, ep4_6_b / 接 口的多重继承 nabstract void volume(); n nclass ep4_6_Cylinder implements ep4_6_c / 以第3个接口实现类 ndouble radius; nint height; nString color; npublic ep4_6_Cylinder(double r, int h) nradius = r; nheight = h; n npublic double

20、area() / 实现第1个接口的方法 nreturn radius * radius * pi; n npublic void setColor(String c) / 实现第2个接口的方法 ncolor = c; nSystem.out.println(形状的颜色: + color); n npublic void volume() / 实现第3个接口的方法 nSystem.out.println(圆柱体的体积: + area() * height); n n nclass ep4_6 npublic static void main(String args) nep4_6_Cylinde

21、r One = new ep4_6_Cylinder(3.0, 5); nOne.setColor(红色); nOne.volume(); n n 4.3内部类 n内部类是在一个类的内部嵌套定义的类,它可 以是其它类的成员,也可以在一个语句块的内 部定义,还可以在表达式内部匿名定义。 4.3.1内部类的定义和使用 n内部类有如下特性: q一般用在定义它的类或语句块之内,在外部引用它时必须给 出完整的名称。名字不能与包含它的类名相同。 q可以使用包含它的类的静态和实例成员变量,也可以使用它 所在方法的局部变量。 q可以定义为abstract。 q可以声明为private或protected。 q

22、若被声明为static,就变成了顶层类,不能再使用局部变量。 q若想在Inner Class中声明任何static成员,则该Inner Class 必须声明为static。 n下面是一个说明内部类如何使用的例子,其中, 定义了两个内部类: qMouseMotionHandler和MouseEventHandler,分 别用来处理鼠标移动事件和鼠标点按事件。 【例4-7】 一个内部类如何使用的例子。 nimport java.awt.*; nimport java.awt.event.*; npublic class TwoListenInner nprivate Frame f; npriva

23、te TextField tf; npublic static void main(String args) nTwoListenInner that = new TwoListenInner(); nthat.go(); n npublic void go() nf = new Frame(Two listeners example); nf.add(North, new Label(Click and drag the mouse); ntf = new TextField(30); nf.add(South, tf); nf.addMouseMotionListener(new Mous

24、eMotionHandler(); nf.addMouseListener(new MouseEventHandler(); nf.setSize(300, 300); nf.setVisible(true); n npublic class MouseMotionHandler extends MouseMotionAdapter npublic void mouseDragged(MouseEvent e) nString s = Mouse dragging:X= + e.getX() + Y= + e.getY(); ntf.setText(s); n n npublic class

25、MouseEventHandler extends MouseAdapter npublic void mouseEntered(MouseEvent e) nString s = The mouse entered; ntf.setText(s); n npublic void mouseExited(MouseEvent e) nString s = The mouse left the building; ntf.setText(s); n n n 4.3.2匿名类的定义和使用 n匿名类是一种特殊的内部类,它是在一个表达 式内部包含一个完整的类定义。当一个内部类 的类声名只是在创建此类对

26、象时用了一次,而 且要产生的新类需继承于一个已有的父类或实 现一个接口,才能考虑用匿名类。由于匿名类 本身无名,因此它也就不存在构造方法,它需 要显示地调用一个无参的父类的构造方法,并 且重写父类的方法。 n所谓的匿名就是该类连名字都没有,只是显示 地调用一个无参的父类的构造方法。 4.4 Class类 nClass是java.lang包中的类,该类的实例用来 封装对象运行时的状态。当一个类被加载且创 建对象时,和该类相关的一个类型为Class的 对象就会自动创建。 4.4.1获取类的有关信息 nClass类本身不提供构造方法,不能用new运算符和 构造方法创建一个Class对象。任何对象调用

27、 getClass()方法都可以获取和该对象相关的一个Class 对象,这个Class对象调用如下的方法可以获取创建 对象的类的有关信息,比如,类的名字、类中的方法 名称、成员变量的名称等。常用方法如下所示: qString getName(); 返回类的名字 qConstructor getDeclaredConstructor(); 返回类的全部构 造方法 qField getDeclaredFields(); 返回类的全部成员变量 qMethod getDeclaredMethods(); 返回类的全部方法 【例4-9】使用相应的Class对象列出全 部成员变量和方法的名称。 nimpo

28、rt java.lang.reflect.*; nclass Rect ndouble width, height, area; npublic double getArea() narea = height * width; nreturn area; n n npublic class ep4_9 npublic static void main(String args) nRect rect = new Rect(); nClass cs = rect.getClass(); nString className = cs.getName(); nConstructor con = cs.

29、getDeclaredConstructors(); nField field = cs.getDeclaredFields(); nMethod method = cs.getDeclaredMethods(); nSystem.out.println(类的名字: + className); nSystem.out.println(类中有如下的成员变量:); nfor (int i = 0; i field.length; i+) nSystem.out.println(fieldi.toString(); n nSystem.out.println(类中有如下的方法:); nfor (int i = 0; i method.length; i+) nSystem.out.println(methodi.toString(); n nSystem.out.println(类中有如下的构造方法:); nfor

温馨提示

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

评论

0/150

提交评论