《面向对象程序设计》由会员分享,可在线阅读,更多相关《面向对象程序设计(61页珍藏版)》请在金锄头文库上搜索。
1、第4章继承与多态14.1 继承与多态的实现技术继承是指一个类的定义可以基于另外一个已 经存在的类,即子类基于父类,从而实现父 类代码的重用。两个类之间的这种继承关系 可以用UML图形符号表示:2父类与子类相比较,涵盖了更加共性的内容 ,更加具有一般性,而子类所添加的内容更 加具有个性,是一般性之外的特殊内容,因 此,这种类的继承关系充分地反映了类之间 的“一般-特殊”关系。类的继承具有传递性,即子类还可以再派生 子类,最终形成一个类层次结构。在Java语言中,通过定义子类支持继承性。 不仅如此,Java还提供了抽象类和接口,以 便使类层次得到更高级别的抽象。3多态性是面向对象程序设计的又一个核
2、心概 念,它有助于增加软件系统的可扩展性、自 然性和可维护性。所谓多态是指不同的类对 象收到同一个消息可以产生完全不同的响应 效果的现象。利用多态机制,用户可以发送 一个通用的消息给各个类对象,而实现细节 由接收对象自行决定,这样,同一个消息可 能会导致调用不同的方法。 4类层次结构举例54.2 类的继承4.2.1 定义子类子类是通过在定义类时利用关键字extends指出父类实现的,其语法格式为:Modifier class ClassName extends SuperClassName/ClassBody6在一个公司中,雇员是该公司聘用的工作人员 ,经理是管理公司的一种特殊雇员,这类雇员
3、不但拥有普通雇员的所有特征外,还可以得到 公司发给的特殊津贴,因此这两个类可以用继 承关系进行描述,雇员类Employee是父类,经 理类Manager是子类。假设Employee类只包含姓 名、所在部门和基本工资三个属性及相关的行 为方法,Manager类在继承Employee类所有内容 的基础上,还需要附加一个描述特殊津贴的属 性及相关的行为方法。 举例1:公司雇员78public class Employee/ 雇员类 private String name;/ 姓名 private double salary;/ 工资 private String department;/ 部门 pu
4、blic Employee() name = “; salary = 0.0; department = “; public Employee(String name, double salary, String department) this.name = new String(name); this.salary = salary; this.department = new String(department); public void setName(String name) this.name = new String(name); public void setSalary(do
5、uble salary) this.salary = salary; public void setDepartment(String department) this.department = new String(department); public String getName() return name; public double getSalary() return salary; public String getDeparyment() return department; public String toString() return “name: “ + name + “
6、nsalary: “ + salary + “ndepartment: “ + department; 9public Manager extends Employee / 经理类 private double special; / 特殊津贴 public Manager() super(); special = 0.0; public Manager(String name, double salary, String department, double special) super(name, salary, department); this.special = special; pu
7、blic void setSpecial(double special) this.special = special; public double getSpecial() return special; public String toString() return super.toString() + “nspecial: “ + special; 10任何一个几何图元都有颜色和原点这两个基本属性。矩形是一种图元,它还有长(length)、宽(width)两个属性,正方形是一种特殊的矩形,它的特殊性在于长和宽相等。ShapRectangleSquare举例2:几何图元处理11两个属性:一
8、个是颜色Color类;另一个是原点,使用类库中的Point类。Shape类12public class Color /Color类定义 private int red; / 红色private int green; / 绿色private int blue; / 蓝色public Color()red=0;green=0;blue=0; /构造方法 public Color(int red,int green,int blue) /构造方法 if (red255) this.red=0; else this.red=red; if (green255) this.green=0; else t
9、his.green=green; if (blue255) this.blue=0; else this.blue=blue; 13public void setColor(int red,int green,int blue) /设置颜色 if (red255) this.red=0;else this.red=red;if (green255) this.green=0;else this.green=green;if (blue255) this.blue=0;else this.blue=blue; public int getRed()return red; /获取红色 public
10、 int getGreen()return green; /获取绿色 public int getBlue()return blue; /获取蓝色 public String toString() /将颜色信息转换成字符串描述形式 return “Red: “+red+“ ,Green: “+green“+“ ,Blue: “+blue; 14Shape 类的定义 15public class Shape / Shape类定义 private Color color; / 颜色属性private Point origin; /原点属性public Shape() / 构造方法color=new
11、 Color();origin=new Point();public Shape(Color c, Point o) /构造方法 color=c; origin=o; public void setShape(Color c,Point o) / 设置几何图形的颜色和原点 color=c; origin=o; public Color getColor()return color; / 获取颜色public Point getOrigin()return origin; / 获取原点public String toString() / 将几何图形的信息转换成字符串描述形式 return col
12、or.toString()+“n“+origin.toString(); 16Rectangle类的UML类图描述17public class Rectangle extends Shape /Rectangle类定义 private int length; /长private int width; /宽public Rectangle() /构造方法 super(); /调用父类的构造方法length=0;width=0;public Rectangle(Color c,Point o,int l,int w) /构造方法super(c,o);length=l;width=w;public
13、int getLength()return length; /获取长度public int getWidth()return width; /获取宽度public void setLW(int l,int w)length=l;width=w; /设置长、宽 18Square类不需要增加新的成员变量,只重新定义一些适用于正方形的成员方法或更改一些成员方法的接口形式以便更加适用于正方形即可。Square类19public class Square extends Rectangle / Square类定义public Square() super();public Square(Color c,
14、Point o,int e) super(c,o,e,e); public int getEdge() return getLength(); /获取边长public void setEdge(int e) setLW(e,e); /设置边长20在Java语言中,子类将继承父类的成员,但子类对象对父类成员的可访问性却由访问属性控制。如果子类与父类在同一个包中,子类可以直接访问父类具有public、proteced和默认访问属性的成员。如果子类和父类不在同一个包中,子类只能够直接访问父类具有public、proteced访问属性的成员,而具有private和默认访问属性的成员需要通过具有publ
15、ic或protected的成员方法实现访问目的。 21在同一个包中子类访问父类成员的规则22在不同包中子类访问父类成员的规则23在Java语言中,子类不负责调用父类中带参数的构造 方法。若要在创建子类对象时希望对从父类继承的成 员变量初始化,就要在子类的构造方法中利用 super()调用父类的构造方法,并且必须将它作为子 类构造方法中的第一条语句。如果第一条语句不是调用父类构造方法的语句,系统 将自动地插入一条调用父类默认构造方法的语句。由 于默认的构造方法不带参数,所以,如果父类定义了 带参数的构造方法,而没有定义不带参数的构造方法 ,将会出现编译错误。 4.2.2 子类的构造方法24public cla