第四章面向对象程序设计 面向对象的特点主要概括为抽象性、继承性 多态性和封装性。本章我们将站在面向对象 程序设计原则和方法的高度,围绕这4个特 点讲解面向对象程序设计(OOP)的基本方 法
Java程序设计大学教程 第四章 面向对象程序设计 面向对象的特点主要概括为抽象性、继承性、 多态性和封装性。本章我们将站在面向对象 程序设计原则和方法的高度,围绕这4个特 点讲解面向对象程序设计(OOP)的基本方 法
4.1原则和方法 面向对象程序设计的重要原则有: ■分而治之原则 ■封装原则 ■接口原则 信息隐藏原则 一般性原则 可扩展性原则 ■抽象原则
Java程序设计大学教程 4.1原则和方法 面向对象程序设计的重要原则有: ◼ 分而治之原则 ◼ 封装原则 ◼ 接口原则 ◼ 信息隐藏原则 ◼ 一般性原则 ◼ 可扩展性原则 ◼ 抽象原则
4.1原则和方法 面向对象在程序设计中实现的方法: ■分解与封装 灯与卖 ■服务与客户 简单稳定 b复杂多变
Java程序设计大学教程 4.1原则和方法 面向对象在程序设计中实现的方法: ◼ 分解与封装 ◼ 继承与合成 ◼ 接口与实现 ◼ 服务与客户
4.2继承 对象的继承是一种在保持对象差异性的同时 共享对象相似性的复用。它是源自类的泛化 机制。这种抽象机制允许类之间共享代码 大大减少了代码长度并且使软件易于维护 对象通过继承,保证了实现部分紧内聚和松 耦合的良好特性
Java程序设计大学教程 4.2 继承 对象的继承是一种在保持对象差异性的同时 共享对象相似性的复用。它是源自类的泛化 机制。这种抽象机制允许类之间共享代码, 大大减少了代码长度并且使软件易于维护。 对象通过继承,保证了实现部分紧内聚和松 耦合的良好特性
4.2.1使用继承 1.基类与派生类 示例程序4-2 Square类( Square. java) 3aa中派生类通过 extends public class Square extends Retangle t 示例程序4-1 Retangle类( Retangle.java) public Square ( double side)t public class Retangle t idth) public Retangle(double l, double wt public double calcPerimetero t length =I; return length*4 width =w public String toString t public double calcPerimeterot return"边长为"+ length+"的正方形"; return 2*(length width) public double calcArea return length width; are public String tostring t Square需要重写并覆盖基类的 calcPerimeter方法来计算周长 return"长为"+ length+"宽为"+wdth+"的长方形"; eter double 周长=4× length rIng protected double length; private double width 四+∠达1U类图中, Square继承了 Rectangle,是 Rectangle类的扩展
Java程序设计大学教程 4.2.1 使用继承 1. 基类与派生类 ◼ Java中派生类通过extends 关键字继承基类,并通过 super关键字访问基类的构 造函数和方法。 ◼ Java中所有的类都继承了 Object类的toString方法, 我们可以重写并覆盖 toString方法,使之带有对 象的具体信息,以便我们跟踪 和调试对象。 ◼ 继承关系形成了树状的类层次 结构。继承产生的派生类不能 直接访问其基类的private成 员,但所有其他基类成员通过 继承成为派生类的成员后,保 持它们原来的成员的可访问性, 并可在派生类中使用。 面积 = length × width 周长 = 2 × (length + width) Square需要重写并覆盖基类的 calcPerimeter方法来计算周长。 周长 = 4 × length Square可以继承基类Rectangle的 calcArea方法来计算面积,无须 另写代码 图 4-2在这个UML类图中,Square继承了Rectangle,是Rectangle类的扩展 示例程序 4-1 Retangle类(Retangle.java) public class Retangle { public Retangle(double l, double w) { length = l; width = w; } public double calcPerimeter() { return 2 * (length + width); } public double calcArea() { return length * width; } public String toString() { return "长为" + length + "宽为" + width + "的长方形"; } protected double length; private double width; } 示例程序 4-2 Square类(Square.java) public class Square extends Retangle { public Square(double side) { super(side,side); } public double calcPerimeter() { return length * 4; } public String toString() { return "边长为" + length + "的正方形"; } }
4.2.1使用继承 okch3. gardensys1 Fruit 生类 gardenerName: String #input int -fruits Fruit #fruitName: String 2.继承在果 +Gardener 园系统中 的使用 erry TropicalS +TropicalFruit +CitrusFruit int
Java程序设计大学教程 4.2.1 使用继承 1. 基类与派 生类 2. 继 承 在 果 园 系 统 中 的使用
4.2.2继承与合成 ■面向对象程序设计中,通过合成或通过继承都可以 在不同的环境中重用已有的设计和实现。但经验表 明,除非所有继承的方法都有意义,否则还是应当 优先考虑使用合成而不是继承。因为依赖于对象合 成技术的设计有更好的重用性或更简单 Employee Employee +Dint +name: string tname String -status Employee status +calc salary: fioat +getstatus. Employeestatus calcs +setstatus vold status: Employee Status FullTime PartTime Retired FullTime PartTime +calc Salary float +calc salary float +calc salary flo alc salary float +calc salary float Salary: fioat
Java程序设计大学教程 4.2.2 继承与合成 ◼ 面向对象程序设计中,通过合成或通过继承都可以 在不同的环境中重用已有的设计和实现。但经验表 明,除非所有继承的方法都有意义,否则还是应当 优先考虑使用合成而不是继承。因为依赖于对象合 成技术的设计有更好的重用性或更简单
4.3多态 1多态的意思是具有多种形态,它是面向对象程序设计的 重要思想方法。多态在面向对象程序设计中意味着通过 动态绑定原理,使用单个变量来引用不同类的对象,自 动调用引用对象类的对应方法 动态绑定机制,可以在运行期判定对象的类型,并调用 其相应的方法。也就是说,编译器无需知道对象的类型 但方法的绑定和调用机制能够找岀正确的方法体并加以 调用。 同名方法的覆盖( override)和重载(oⅤ erload)是两 种完全不同的机制 替代原则( substitution principle):基类应该可以用 其派生类代换。替代过程也是派生类向上转型的过程 向上转型是一种常用的安全的类型转换,通过向上转型 可实现多态性
Java程序设计大学教程 4.3 多态 ◼ 多态的意思是具有多种形态,它是面向对象程序设计的 重要思想方法。多态在面向对象程序设计中意味着通过 动态绑定原理,使用单个变量来引用不同类的对象,自 动调用引用对象类的对应方法。 ◼ 动态绑定机制,可以在运行期判定对象的类型,并调用 其相应的方法。也就是说,编译器无需知道对象的类型, 但方法的绑定和调用机制能够找出正确的方法体并加以 调用。 ◼ 同名方法的覆盖(override)和重载(overload)是两 种完全不同的机制。 ◼ 替代原则(substitution principle):基类应该可以用 其派生类代换。替代过程也是派生类向上转型的过程。 向上转型是一种常用的安全的类型转换,通过向上转型 可实现多态性
4.3.1多态与动态绑定 1.派生类的对象具有多个类型m TropicalFruit("香蕉",1000) = new Berry("葡萄",2000)冫 fruits[2]= new TropicalFruit("菠萝",2000); 2.动态绑定实现多态 fruits[3]= new Berry("草莓",1000) fruits[4]= new Citrus Fruit(“橘子",1000); 我们可以像对待基类对象那样对待派住类对象,它们的共 性表现在继承下来的同名类成员所有继承于共同基类的 派生类对象可以当做是这些基类的对象。 数组属性索引 Food myFooqi派生类类型 TropicalFruit Tropical Fruit CitrusFruit Fruit my Fruit;水果名称 香蕉 葡萄 菠萝 草莓 橘子 orange= nel CitrusFruit(橘1000/包建橘子厨象 my Food = orange(;相当 damy Food=(Fc oodorange my Food. eat()用的是 Citrusfruit的过法去剥皮吃橘子 myFruit= orange;/相当于 my Fruit卡(Frut) borange L K& SAmira myFu:eat调用的还是 CitrusFruit的eat方法:剩皮吃感m 投入”+ input return g
Java程序设计大学教程 4.3.1 多态与动态绑定 1. 派生类的对象具有多个类型 2. 动态绑定实现多态 public int gain() { int g=input*2;//收益是投入的两倍 return g; } public int gain() { //收益不变 ... } public int gain() { //收益-200 ... } public int gain() { // 收益是投入的3倍 int g = input * 3; System.out.println(fruitName + "投入" + input + " 净收益" + g); return g; } 覆盖(override) fruits[i].gain(); 程序运行时动 态确定实现的 gain方法 数组属性索引 0 1 2 3 4 派生类类型 TropicalFruit Berry TropicalFruit Berry CitrusFruit 水果名称 香蕉 葡萄 菠萝 草莓 橘子 fruits[0] = new TropicalFruit("香蕉", 1000); fruits[1] = new Berry("葡萄", 2000); fruits[2] = new TropicalFruit("菠萝", 2000); fruits[3] = new Berry("草莓", 1000); fruits[4] = new CitrusFruit("橘子", 1000); 我们可以像对待基类对象那样对待派生类对象,它们的共 性表现在继承下来的同名类成员。所有继承于共同基类的 派生类对象可以当做是这些基类的对象。 Food myFood; Fruit myFruit; CitrusFruit orange; orange = new CitrusFruit("橘子",1000); //创建橘子对象 myFood = orange(); //相当于myFood = (Food)orange; myFood.eat(); //调用的是CitrusFruit的eat方法:剥皮吃橘子 myFruit = orange; //相当于myFruit = (Fruit)orange; myFruit.eat(); //调用的还是CitrusFruit的eat方法:剥皮吃橘子
4.3.2方法的绑定 ■所谓的方法绑定( Binding)就是建立方法调用( Method ca‖)和 方法本体( Method body)之间的关联。如果方法是“早绑定”、 “先期绑定”的,也就是在编译时编译器就能准确地判断应该调用的 那个方法称为静态绑定方法。Java中这类方法包括 private、 static、 fina方法以及构造函数。如果方法是“晚绑定”、“后期绑定”的 也就是在运行时由庫拟机调用回该对象变量所指对象的实际类型相匹 配的方法版本,动态决定的方法,称为动态绑定方法。Java中 private、 static、fna方法以及构造函数外的其他方法都是动态绑 定方法 ■Java语言中使用关键字fina|来定义常量。但是关键字fina还有另外 2个重要用途:一个是阻止类(fina类)被继承,另一个是阻止方法 fina方法)被覆盖( override)。 ■抽象方法是一种没有实现的方法。定义有抽象方法的类我们称之为抽 象类。抽象方法和抽象类都使用 abstra¢t关键字来标识。含有抽象方 法的类必须定义为抽象类,但是没有抽象方法的类也可以定义为抽象 类。但无论如何,抽象类都不能创建实例
Java程序设计大学教程 4.3.2 方法的绑定 ◼ 所谓的方法绑定(Binding)就是建立方法调用(Method Call)和 方法本体(Method Body)之间的关联。如果方法是“早绑定”、 “先期绑定”的,也就是在编译时编译器就能准确地判断应该调用的 那个方法称为静态绑定方法。Java中这类方法包括private、static、 final方法以及构造函数。如果方法是“晚绑定”、“后期绑定”的, 也就是在运行时由虚拟机调用同该对象变量所指对象的实际类型相匹 配的方法版本,动态决定的方法,称为动态绑定方法。Java中除了 private、static、final方法以及构造函数外的其他方法都是动态绑 定方法。 ◼ Java语言中使用关键字final来定义常量。但是关键字final还有另外 2个重要用途:一个是阻止类(final类)被继承,另一个是阻止方法 (final方法)被覆盖(override)。 ◼ 抽象方法是一种没有实现的方法。定义有抽象方法的类我们称之为抽 象类。抽象方法和抽象类都使用abstract关键字来标识。含有抽象方 法的类必须定义为抽象类,但是没有抽象方法的类也可以定义为抽象 类。但无论如何,抽象类都不能创建实例