知识大全 面向对象思想之 -- 继承以及多态

Posted

篇首语:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 面向对象思想之 -- 继承以及多态相关的知识,希望对你有一定的参考价值。

  在 OOP简介:理解类和对象 这篇文章中 我们讨论了继承和多态性的好处 我们还粗略的学习了如何扩展基类定义子类 继承基类中合适的行为和属性而重载那些并不适合的行为和属性 这种方式能够削减代码宏余以及错误的堆积     现在我们将更深入的考察多重继承性以及Java是如何处理它的 我们还将通过学习动态绑定来学习多态性      深入继承性  一些面向对象的语言提供叫做 多重继承 的特点 当一个对象需要从多于一个的基类继承行为和属性的时候这是有价值的 多重继承在有些情况下是复杂的 例如 假设我们需要定义一个基类 Animal 然后是Animal的两个子类 LandAnimal 和 WaterAnimal 现在我们想要定义一个类来代表青蛙 青蛙是两栖动物 所以我们自然会想到定义Frog类从LandAnimal和WaterAnimal类继承 这使得Frog类能够同时从LandAnimal 和WaterAnimal类继承所需的行为和属性     初看起来这是相当简单的;但是 让我们为Animal添加一个叫做LivingEnvironment的属性 并用方法getLivingEnvironment来返回它 我们假设LandAnimal 和 WaterAnimal类都重载了这个方法来实现特殊的功能 LandAnimal将返回Land作为它的LivingEnvironment属性的值 而WaterAnimal将返回Water作为它的LivingEnvironment属性的值 现在 当我们将Frog类作为LandAnimal 和 WaterAnimal 子类实现的时候 想要得到Frog的LivingEnvironment属性值 这时将遇到一个麻烦:Frog类的getLivingEnvironment方法是返回Land值呢还是Water值?答案取决于编译器如何处理多重继承     我在前面的文章里就已经说过 Java不支持多重继承 但它确实允许一个对象通过使用叫做 接口 的功能拥有多个特性 下面的例子显示了定义LandAnimal的接口的可能的定义代码:  public interface LandAnimal      public int getNumberOfLegs();    public boolean hasATail();      一个使用接口的类在类定义语句的开始添加implements+接口名 例如 在Java中 我们会以下面的方式定义Frog类:    public class Frog extends Animal implements LandAnimal WaterAnimal    接口并没有什么实际的功能;相反 它的作用是联系使用者和实现了这个接口的对象 接口保证了对象实现接口定义的方法 而且 一个实现接口的对象能够在运行时被强制转换成接口类型 例如 使用上面的Frog定义 并且假设LandAnimal类定义了一个叫做getNumberOfLegs的方法而WaterAnimal定义了一个叫做hasGills的方法 那么一个Frog类的实例可以在运行时被强制转换成LandAnimal或WaterAnimal对象:    Frog aFrog = new Frog();  int legCount = ((LandAnimal)aFrog) getNumberOfLegs();  Boolean gillFlag = ((WaterAnimal)aFrog) hasGills();    注意F为什么能够被强制转换成一个LandAnimal对象即使实际的LandAnimal对象并没有被创建 这使得我们能够在运行时以其带有的任何 身份 调用一个对象 这就是所谓的 动态绑定 或 运行时绑定      深入多态性  Java使用动态绑定来使多态成为可能 它指的是Java用来在运行时选择调用的方法或对象的机制 重载构成了了Java中的一种特殊的多态机制 它表现在当一个类的两个或者两个以上的方法拥有相同的名字但是不同的参数列表 或者说 方法签名 一个方法的签名指的是方法的名字以及参数的类型和数目 类的每一个方法都有与之相关的唯一的签名 类可以有多个名字相同的方法只要它们的参数列表是唯一的 例如 我们能够为Animal类定义两个名字为getHello的方法 用其中一个方法来获得动物通常的叫声 而用另一个获得当动物被惊吓或是抚摩的时候的叫声 我们将给每一个方法唯一的签名:    public String getHello();  public String getHello(int mood);    现在 让我们修改例子程序来将我们讨论的一些概念付诸实践:     public class HelloWorld    public static void main(String[] args)    Dog animal = new Dog();  Cat animal = new Cat();  Duck animal = new Duck();    System out println( A dog says +animal getHello()  + when scared says: +animal getHello(Animal SCARED)  + is carnivorous: +animal isCarnivorous()  + is a mammal: +animal isAMammal());  System out println( A cat says +animal getHello()  + when forted says: +animal getHello(Animal FORTED)  + is carnivorous: +animal isCarnivorous()  + is a mammal: +animal isAMammal());  System out println( A duck says +animal getHello()  + when scared says: +animal getHello(Animal SCARED)  + is carnivorous: +animal isCarnivorous()  + is a mammal: +animal isAMammal());        abstract class Animal    public static final int SCARED = ;  public static final int FORTED = ;    public boolean isAMammal()    return(true);      public boolean isCarnivorous()    return(true);      abstract public String getHello();  abstract public String getHello(int mood);      interface LandAnimal    public int getNumberOfLegs();  public boolean hasATail();      interface WaterAnimal    public boolean hasGills();  public boolean laysEggs();      class Dog extends Animal implements LandAnimal    // 重载父类的方法  public String getHello()    return( Bark );      public String getHello(int mood)    switch (mood)   case SCARED:  return( Growl );  case FORTED:  return( );      return( Bark );      // LandAnimal 接口的实现  public int getNumberOfLegs()    return( );      public boolean hasATail()    return(true);        class Cat extends Animal implements LandAnimal    // 重载父类的方法  public String getHello()    return( Meow );      public String getHello(int mood)    switch (mood)   case SCARED:  return( Hiss );  case FORTED:  return( Purr );      return( Meow );      // LandAnimal 接口实现  public int getNumberOfLegs()    return( );      public boolean hasATail()    return(true);        class Duck extends Animal implements LandAnimal WaterAnimal    // 重载父类的方法  public String getHello()    return( Quack );      public String getHello(int mood)    switch (mood)   case SCARED:  return( Quack Quack Quack );  case FORTED:  return( );      return( Quack );      public boolean isAMammal()    return(false);      public boolean isCarnivorous()    return(false);      // WaterAnimal 接口实现  public boolean hasGills()    return(false);      public boolean laysEggs()    return(true);      // LandAnimal 接口实现  public int getNumberOfLegs()    return( );      public boolean hasATail()    return(false);        程序执行后输出的结果如下:    A dog says Bark when scared says: Growl is carnivorous: true is a mammal: true  A cat says Meow when forted says: Purr is carnivorous: true is a mammal: true  A duck says Quack when scared says: Quack Quack Quack is carnivorous: false is a mammal: false     总结  综合继承 多态和接口的概念提供了一组强大的编程工具 允许我们重用代码 隔离错误的发生 并获得动态/运行时绑定带来的好处 在下一篇文章里 我们将讨论如何使用Java的变量作用域/可见域规则来控制方法和属性的暴露问题 cha138/Article/program/Java/hx/201311/26843

相关参考

知识大全 面向对象思想之 -- 理解类和对象

  上一次在使用Java开始面向对象的编程这篇文章中我们学习了一个编程语言要真正成为面向对象的它应该支持信息隐藏/封装多态继承和动态绑定另外我们知道了Java完全支持这些功能而且知道了因为Java是一

知识大全 黑马程序员面向对象之多态

  多态可以理解为事物存在的多种体现形态  多态的体现  父类的引用指向了自己的子类对象  父类的引用也可以接收自己的子类对象  多态的前提  必须是类与类之间有关系要么继承要么实现  通常还有一个前

知识大全 面向对象三大特性之封装

  java学习已经到了最核心的章节面向对象的三大特性封装继承和多态接下来会写多篇博文(数目不定请关注近期博客吧!午饭们!)来总结这里面的每一个细节小可很希望每一篇文章的阐述会给你带来一点启发小可也是

知识大全 多态与面向对象(一)

  不管时光如何流逝应该说每个人对他职业生涯的第一次面试都是记忆犹新不是吗?    经过前两轮的筛选我推开那扇门小心翼翼地坐在Andy面前我应聘的职位是C++程序员坦率的讲我有一些紧张您知道的一个找不

知识大全 面向对象的一些术语精解

  多态一个对象变量可以引用多种实际类型的现象叫做多态(polymorphism)在java和c++语言中指的是可以用子类对象赋给父类对象说道多态就要说说覆蓋(overriding)覆蓋实际上指在同一

知识大全 面向对象继承实例(a如何继承b问题)(自写)

经常会看到a如何继承b的问题决定写一下其实继承就是继承父级的属性和方法感兴趣的朋友可以参考下哈希望对大家有所帮助 复制代码代码如下:cha138/Article/program/J

知识大全 批量实现面向对象的实例代码

本文为大家详细介绍下面向对象的继承以及如何实现批量实现面向对象感兴趣的可以参考下哈希望对大家有所帮助 复制代码代码如下:cha138/Article/program/Java/JS

知识大全 网友整理 .net 面试题(附答案)

编者注加粗部分的是答案 ()面向对象的语言具有__继承性_性_封装性_性_多态性性()能用foreach遍历访问的对象需要实现_IEnumerable_接口或声明_GetEnumerator

知识大全 剖析ASP.NET AJAX的面向对象思想

剖析ASP.NETAJAX的面向对象思想  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  人们期待

知识大全 剖析ASP.NET AJAX的面向对象思想[3]

剖析ASP.NETAJAX的面向对象思想[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  接