扩展接口而不是实现它

时间:2013-06-21 05:03:27

标签: java

界面定义(见下文)让我困惑:

public abstract interface Cursor {
    // hide details
}

public abstract interface Parcelable {
    // hide details
}

public interface Foo<T extends Bar> extends Cursor, Parcelable {
    // details omitted for brevity
};
  1. 我认为Java没有多重继承,因此一个类不能extends多个类。
  2. 另一方面,类/接口可以实现多个接口。那么为什么要用extends代替呢? implements

3 个答案:

答案 0 :(得分:14)

Java 7及以下版中的类/接口继承和实现规则如下:

  1. 类只能从单个类继承(单继承)
  2. 一个类可能实现一个或多个接口(多接口实现)
  3. 接口可能从一个或多个接口继承(多接口继承)
  4. 继承时,使用关键字extends,当类继承自类或接口继承自一个或多个接口时。术语extends应理解如下:此类/接口是其父类/接口的扩展 - 它是父或父的所有内容,可能更多

    当一个类实现一个接口(或多个接口)时,使用关键字implements。术语implements应理解如下:此类的实例保证为父接口的方法提供实现

    另请注意,即使抽象类本身未实现接口方法,abstract class在引用父接口时也会使用关键字implements。这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法;因此,该抽象类的任何实例实际上必须是从接口实现方法的子类的实例。例如,这是完全有效的:abstract class AnAbstractClass implements Cursor {},即使Cursor声明了很多方法。

    在您的示例中,接口Foo<T extends Bar>继承自另外两个接口,即CursorParcelable,这是上面第3点的示例。您使用关键字extends而不是implements,因为接口Foo没有实现任何内容:父接口方法的主体仍未定义!如果你有一个实现这两个父接口的类,你可以这样做:

    class AClass implements Cursor, Parcelable {
      @Override public // ... method signature and implementation
                       // for every method in Cursor and Parcelable
    }
    

    另外,请注意,在声明接口时,您不需要使用关键字abstract:类型及其声明的所有方法都是隐式抽象的。这些方法也是隐式公共的(并且不能用任何其他访问修饰符声明),因为接口的目的恰恰是声明对象的公共接口&#34;,即保证哪些方法实现该接口的任何对象都可以公开。


    最后,上面描述的一些概念在Java 8中稍作修改:在该版本中,您将能够提供&#34;默认实现&#34;接口中的方法,以防实现接口的类不实现它们。事情将更类似于&#34;类多重继承&#34;:一个类将能够从多个源继承已实现的方法,这在Java 7或更低版​​本中是不可能的。例如(语法尚未修复):

    interface NaturalNumber {
      void increment();
      default void add(int n) {
        for (int i = 0; i < n; i++) {
          increment();
        }
      }
    }
    
    class NaturalNumberImplementation implements NaturalNumber {
      private int n = 0;
      @Override public void increment() { n++; }
    }
    

    这样做是为了让你在不想要的时候忽略实施某些方法,同时仍然能够实现更好的&#34;可能/需要时的版本。例如:

    class HighPerformanceNaturalNumberImplementation implements NaturalNumber {
      private int n = 0;
      @Override public void increment() { n++; }
      @Override public void add(int n) { this.n += n; }
    }
    

答案 1 :(得分:2)

回答1。

  

Java类只能扩展一个父类。多重继承是   不允许。但是,接口不是类,接口可以   扩展多个父接口。

回答2。

当存在父子关系时,应始终扩展类/接口。扩展类或接口应该没有其他原因。

答案 2 :(得分:0)

接口:

  • 接口扩展接口。

  • 接口可以扩展多个接口。

类:

  • Clases扩展类。

  • 一个类只能扩展一个类。

  • 只有类可以实现接口。

  • 一个类可以实现多个接口。