zoukankan      html  css  js  c++  java
  • java 多重继承

    接口不仅仅只是一种更纯粹形式的抽象类,它的目标比这更高,因为接口是根本没有任何具体实现的--也就是说,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合,

    在导出类中,不强制要求必须有一个抽象的或"具体的"(没有任何抽象方法的)基类,如果要从一个非接口的类继承,那么只能从一个类去继承,其余的元素必须是接口.需要将所有的接口名都置于implements关键字之后,用逗号将它们隔开.可以继承任意多个接口,并可以向上转型为每个接口,因为每个接口都是一个独立类型

    使用接口的核心原因:

    1.为了能够向上转型为多个基类型(以及由此带来的灵活性)

    2.防止客服端程序员创建该类的对象,并且保证这仅仅是一个接口.这就带来一个问题:我们应该使用接口还是抽象类?如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类,事实上,如果知道某事物应该成为一个基类,那么第一选择应该是使他称为接口

    //: interfaces/Adventure.java
    // Multiple interfaces.
    package object;
    interface CanFight {
      void fight();  //ActionCharacter 也有一个fight();
    }
    
    interface CanSwim {
      void swim();
    }
    
    interface CanFly {
      void fly();
    }
    
    class ActionCharacter {
      public void fight() {}
    }    
    
    class Hero extends ActionCharacter
        implements CanFight, CanSwim, CanFly {
      public void swim() {}
      public void fly() {}
    }
    
    public class Adventure {
      public static void t(CanFight x) { x.fight(); }
      public static void u(CanSwim x) { x.swim(); }
      public static void v(CanFly x) { x.fly(); }
      public static void w(ActionCharacter x) { x.fight(); }
      public static void main(String[] args) {
        Hero h = new Hero();
        t(h); // Treat it as a CanFight
        u(h); // Treat it as a CanSwim
        v(h); // Treat it as a CanFly
        w(h); // Treat it as an ActionCharacter
      }
    } ///:~

    二.通过继承来扩展接口

    通过继承可以很容易在接口添加新的方法声明,还可以通过继承在新接口中组合数个接口

    //: interfaces/HorrorShow.java
    // Extending an interface with inheritance.
    
    interface Monster {
      void menace();
    }
    
    interface DangerousMonster extends Monster {
      void destroy();
    }
    
    interface Lethal {
      void kill();
    }
    
    class DragonZilla implements DangerousMonster {
      public void menace() {}
      public void destroy() {}
    }    
    
    interface Vampire extends DangerousMonster, Lethal {//多继承只适用于接口继承
      void drinkBlood();
    }
    
    class VeryBadVampire implements Vampire {
      public void menace() {}
      public void destroy() {}
      public void kill() {}
      public void drinkBlood() {}
    }    
    
    public class HorrorShow {
      static void u(Monster b) { b.menace(); }
      static void v(DangerousMonster d) {
        d.menace();
        d.destroy();
      }
      static void w(Lethal l) { l.kill(); }
      public static void main(String[] args) {
        DangerousMonster barney = new DragonZilla();
        u(barney);
        v(barney);
        Vampire vlad = new VeryBadVampire();
        u(vlad);
        v(vlad);
        w(vlad);
      }
    } ///:~
  • 相关阅读:
    VOA 翻译研讨:2009.2.26 教育报道——在美国学习:网络重新阐释学院之旅
    javac Java 编程语言编译器的使用文档
    在Eclipse中集成Ant编程之配置篇
    ANT使用范例
    MySQL实用命令
    [转]java多线程同步
    Perl 教学 列表和数组变量
    MySql常用命令总结
    MySQL 备份和恢复
    log4j配置详解
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10208572.html
Copyright © 2011-2022 走看看