Java程序设计:chapter05 类的继承和派生_第1页
Java程序设计:chapter05 类的继承和派生_第2页
Java程序设计:chapter05 类的继承和派生_第3页
Java程序设计:chapter05 类的继承和派生_第4页
Java程序设计:chapter05 类的继承和派生_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 类的继承和派生教学目标理解继承的概念和作用派生类的定义理解访问修饰符protected方法的重写继承下的构造函数的使用继承下的finalize方法的使用理解超类和子类的关系15.1 继承的概念和软件的重用性继承是从已有的类中派生出新的类。新的类能吸收已有类的数据属性和行为;并能扩展新的能力。类和类之间的继承关系可以用UML符号表示如图5-1,父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。超类或基类父类子类派生类图5-1 继承关系super/base/parentchild/derived2如表5-1所示,列出了几个超类和子类的实际例子。超类或基类父

2、类子类派生类图5-1 继承关系超 类子 类学生研究生、本科生、小学生形状三角形、圆、矩形雇员教师、医生、职员交通工具轿车、卡车、公交车水果苹果、梨、桃、桔表5-1 继承例子5.1 继承的概念和软件的重用性注意:子类可看做超类的一个特例。子类的对象可当作超类对象。但反过来,不能把超类对象可当作子类对象。例如,轿车可看成是交通工具,但不能把交通工具看成就是轿车。3继承分为单继承和多继承。单继承是指一个子类最多只能有一个父类。多继承是一个子类可有二个以上的父类。由于多继承会带来二义性,在实际应用中应尽量使用单继承。Java类只支持单继承,而接口支持多继承。5.1 继承的概念和软件的重用性4objec

3、tWinDialogWin单继承,in javaClass 1Class 4Class 2Class 3多继承,in C+单继承与多继承例子5继承使软件的代码得到重用。在继承关系中,子类通过吸收已有类的数据(属性)和方法(行为)并增加新功能或修改已有功能来创建新类。软件的重用性不仅节省了程序的开发时间,还促进了经过验证和调试的高质量软件的重用,这增加实现系统的效率。在java中,Object类定义和实现了Java系统所需要的众多类的共同行为,它是所有类的根类,所有的类都是由这个类继承、扩充而来的。5.1 继承的概念和软件的重用性65.2 派生类的定义派生类(子类)定义的一般格式为: 类修饰符

4、class 子类名 extends 父类名 成员变量定义; 成员方法定义;派生类的定义中,用关键字extends来明确指出它所继承的超类。定义一个类时,如果没有显示使用extends关键字,则该类的直接父类为Java.lang.Object类。Java中,Object类是除自身以外的其他所有类的直接或间接父类。例5-1 通过继承来定义派生类75.2 派生类的定义class Automobile /超类int Number;void setNumber(int Num)Number=Num;void showNumber()System.out.println(Automobile number

5、:+Number);class Truck extends Automobile/派生类int capacity;void setCapacity(int truckCapacity)capacity=truckCapacity;void showCapacity()System.out.println(Truck Capacity:+capacity);class AutomobileExtendspublic static void main(String args)Truck tc=new Truck();tc.setNumber(8888);/派生类使用从超类中继承的方法setNumb

6、ertc.setCapacity(10);tc.showNumber();/派生类使用从超类中继承的方法showNumbertc.showCapacity();汽车类Automobile为父类,卡车类Truck为子类。Automobile类定义了所有汽车具有的共同属性牌照(Number),和领取牌照(setNumber)、显示牌照(showNumber)的两个方法Automobile ab=tc;ab=new Truck();Truck tc=new Automobile();?85.3 作用域和继承第4章讨论了成员访问控制修饰符:public、private、package和protecte

7、d。超类public的成员可以在超类中使用,也可以在子类使用,程序可以在任何地方访问public超类成员。超类protected成员,可在子类和同一包内其他类被访问。超类package成员,可在同一包内其他类被访问,在子类中不能被访问。 。超类的private成员仅在超类中使用,在子类中不能被访问。子类从超类中继承成员时,超类的所有public和protected成员在子类中,都保持它们原有的访问修饰符。95.4方法的重新定义(overriding)在子类中重新定义父类的同名方法(方法头相同),则称子类重新定义(overriding)了父类的该方法,或称重写或覆盖。子类的对象调用这个方法时,将

8、使用子类中定义的方法,对它而言,父类中定义的方法就“看不见”了。如要在子类的方法中要使用超类的这个被重写的方法,用:super.超类同名方法()。例5-2 方法的重写10例5-2 方法的重写/Point.javapublic class Point protected int x; protected int y; public Point() public Point( int xValue, int yValue ) x = xValue; y = yValue; public void setX( int xValue ) x = xValue; public int getX() re

9、turn x; public void setY( int yValue ) y = yValue; public int getY() return y; public String toString() return + x + , + y + ; /Circle.javapublic class Circle extends Point private double radius; public Circle() public Circle( int xValue, int yValue, double radiusValue ) x = xValue; y = yValue; setR

10、adius( radiusValue ); public void setRadius( double radiusValue ) radius = ( radiusValue 0.0 ? 0.0 : radiusValue ); public double getRadius() return radius; public double getDiameter() return 2 * radius; public double getCircumference() return Math.PI * getDiameter(); public double getArea() return

11、Math.PI * radius * radius; public String toString() /重写了超类Point类中的toString方法 return Center = /通过super调用超类中的被重写的toString方法 +super.toString()+ Radius = + radius; 11例5-2 方法的重写/CircleTest.javaimport javax.swing.JOptionPane;public class CircleTest public static void main( String args ) Point point=new Po

12、int(20,30); Circle circle = new Circle( 37, 43, 2.5 ); String output=The location of point are: +point.toString(); output+=nThe location and radius of circle aren+circle.toString(); JOptionPane.showMessageDialog( null, output ); System.exit( 0 ); 12例:方法的重写(overriding)class A void print() System.out.

13、println(“父类的print方法); class B extends A void print() System.out.println(“子类的print方法);” void display() print(); super.print(); public class Test public static void main(Stringargs) B b=new B(); b.display(); 135.5继承下的构造方法和finalize方法继承下的构造方法的调用次序:子类对象的实例化过程开始于一系列的构造方法调用,类继承层次结构中超类的构造方法调用先于子类的构造方法,最先调用的

14、构造方法总是Object类的构造方法。 。子类构造函数在执行自己的任务之前,将显式地(通过super引用)或隐式地(调用超类的默认构造函数或无参数构造函数)调用其直接超类的构造函数。类似地,如果超类派生于另一个类,则要求超类的构造函数调用层次结构中上一级类的构造函数,依此类推。在调用请求中,最先调用的构造函数总是Object类的构造函数。最后才会执行原有的子类构造函数。继承下的finalize方法的调用次序类层次结构中子类finalize方法调用应先于超类的finalize方法,直至最后调用Object超类的finalize方法。 finalize方法的定义格式: protected void

15、 finalize() 14子类构造方法中调用父类的构造方法在类的继承层次结构中,父类和子类都有自己的构造方法,但子类不会继承父类的构造方法。子类构造方法中,调用直接父类构造方法的方式有两种:是用super关键字来显示调用,另一种是隐式调用。1.显示调用在子类的构造方法中,可以用关键字super来调用直接父类的构造方法。语法格式为:super(参数);2.隐式调用在子类构造方法的方法体中,如果没有显式调用直接父类的构造方法,则系统在执行子类的构造方法前会自动调用直接父类的不带参数的构造方法.15继承下的构造方法的调用次序1.显示调用class A int a=11;A() System.out

16、.println(WA+this.a);A(int a) this.a = a; System.out.println(A+this.a);class B extends A int a=22;B(int a) super(a); System.out.println(B+this.a);public static void main(String args) B x = new B(2);2.隐式调用class A int a=11;A() System.out.println(WA+this.a);A(int a) this.a = a; System.out.println(A+this

17、.a);class B extends A int a=22;B(int a) System.out.println(B+this.a);public static void main(String args) B x = new B(2);16继承下的finalize方法的调用次序class T1 public T1() System.out.println(T1构造方法);public void finalize() System.out.println(T1撤销方法);class T2 extends T1 public T2() System.out.println(T2构造方法);p

18、ublic void finalize() System.out.println(T2撤销方法);super.finalize();class T3 extends T2 public T3() System.out.println(T3构造方法);public void finalize() System.out.println(T3撤销方法);super.finalize();public class Test public static void main(String args) T3 t = new T3();t = null;System.gc();17继承下的finalize方法

19、的调用次序class T1 public T1() System.out.println(T1构造方法);public void finalize() System.out.println(T1撤销方法);class T2 extends T1 public T2() System.out.println(T2构造方法);public void finalize() System.out.println(T2撤销方法);super.finalize();class T3 extends T2 public T3() System.out.println(T3构造方法);public void

20、finalize() System.out.println(T3撤销方法);super.finalize();public class Test public static void main(String args) T3 t = new T3();t = null;System.gc();185.6 超类和子类的关系(一)再次使用点圆继承层次来讨论超类与子类的关系。为了使圆类继承点类并能访问点类中的成员变量,可将点类中的x和y定义成protected的成员.例5-4 使用protected数据的点-圆层次例5-4中,Circle2类通过继承Point2类,就可以在Circle2类中访问它的

21、超类(Point2类)的protected和public成员了。195.6 超类和子类的关系(二)但在使用protected成员变量时,会产生两个问题:子类可将非法值赋给超类的变量,导致该变量处于非法状态。例如,如果将Circle2的成员变量radius声明为protected,则它的子类就能够将负值赋给radius变量。编写的子类Circle2方法更依赖于超类Point2实现。例如,如果由于某种原因将成员变量x和y的名称改为xCoordinate和yCoordinate,则子类直接引用这些超类成员变量的所有地方都必须进行相应地修改。为了使子类应依赖于超类服务,而不应依赖于超类实现:把超类中的

22、成员变量声明为private,并在超类中定义访问这些private成员变量的public型的方法。205.6 超类和子类的关系例5-5 把超类中的成员变量声明为private, 在子类中使用从超类中继承过来的方法对这些私有成员变量进行访问。21例5-5 /Point3.javapublic class Point2 private int x; private int y; public void setX( int xValue ) x = xValue; public int getX() return x; public void setY( int yValue ) y = yValu

23、e; public int getY() return y; 22例5-5/Circle3.javapublic class Circle3 extends Point3 private double radius; public Circle3() /隐式调用超类的无参构造方法 public Circle3( int xValue, int yValue, double radiusValue ) super( xValue, yValue ); /显式调用超类的构造方法 setRadius( radiusValue ); . public String toString() /调用超类的toString方法 return Center = + super.toString() + ; Radius = +

温馨提示

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

评论

0/150

提交评论