Interfaces &
Abstract Classes
Agenda
•   概述
•   接口
•   接口实现
•   接口 - 多重继承
•   接口 - 命名冲突
•   接口 - 属性
•   接口与工厂方法
•   抽象类和方法
概述
• 接口(interface) 和 抽象类(abstract class)提供
  了一种比实现类更为有效的方式, 用于实现
  接口与实现的分离;
• 接口 相比 抽象类, 是一种更高层次的抽象,
  它声明了一种规范, 所有基于该接口的实现
  类都必须实现该规范;
• 本章将从接口介绍, 然后介绍抽象类.
接口
• 使用interface关键字声明一个接口, 在接口中可
  以定义static final属性和声明方法, 接口中没有
  任何方法的实现; 示例:
public interface InterfaceA {
  public static final int VALUE_ONE = 1;
  public void doSomething();
}
• 不管是否作了声明, 接口中的属性默认是static
  final, 方法默认是public;
• 接口本身的访问权限可以是public的, 也可以是
  包访问权限;
• 示例: demo/Demo1.java
接口实现
• 使用implements关键字来实现一个接口, 如下:
                        interface A
                        void f1();
                        void f2();

           implements                  implements


       class ClassA                   class ClassB
       void f1()...                   void f1()...
       void f2()...                   void f2()...


• 接口中所有的方法默认都是public的, 即使不声
  明为public; 子类在实现接口中声明的方法时,
  必须将方法声明为public, 否则无法编译通过;
• 示例: demo/Demo2.java
接口 – 多重继承
• 与C++不同的是, Java语言不支持同时继承多
  个类; 但是java提供了接口, 一个类可以同时
  实现多个接口;
• 示例: demo/Demo3.java
接口继承
• 在创建新的接口时, 可以继承自一个或者多
  个接口, 新的接口将继承这些接口中所有的
  方法声明; 比如:
interface A {...}
interface B extends A {...}
interface C extends A, B {...}
• 示例: demo/Demo4.java
接口 – 命名冲突
• 在同时实现多个接口时, 需要注意方法名称
  冲突的问题; 比如:
interface I1 { void f(); }
interface I2 { int f(); }
class C implements I1, I2 {...} // compile error
• 在上面的例子中I1 和 I2接口均声明了方法f,
  两者只是返回值不同;
• 示例: demo/Demo5.java
接口 – 属性
• 可以在接口中声明属性, 接口中所有的属性无
   论声明与否都是public static final的; 示例:
// 在JDK5引入enum类型之前, 通常使用只包含属性声明的接口来达到类似效果
public interface Months {
int JANUARY = 1, FEBRUARY = 2,
     MARCH = 3, APRIL = 4, MAY = 5 ......
• 接口属性必须在声明时进行赋值, 赋值可以使
  非常量表达式, 示例:
public interface RandVals {
   Random RAND = new Random(47);
   int RANDOM_INT = RAND.nextInt(10);
   long RANDOM_LONG = RAND.nextLong() * 10; ...
• 示例: demo/Demo6.java
接口与工厂方法
• 工厂方法(Factory Method)设计模式提供了除构
  造器之外的另一种方式用于创建对象, 示例:
class SomeObject {...}
class SomeObjectFactory {
    SomeObject createObject() {...}
}
其中createObject方法被称为工厂方法, 工厂方
法本身会调用constructor创建对象;
• 接口与工厂方法: 工厂方法可以声明为返回某
  个接口, 并根据不同的情况返回具体的实现类.
  这样客户代码就可以与具体的实现完全解耦合.
• 示例: demo/Demo7.java
抽象类 和 方法
• 抽象类是一种介于接口和实现类之间的抽象层
  次, 抽象类可以包含抽象方法 和 具体方法;
• 使用abstract class声明一个抽象类, 在方法声明
  前加abstract用于声明一个抽象方法. 示例:
public abstract AbstractClass {
  void concreteMethod() {...}
  abstract void abstractMethod();
}
• 示例: demo/Demo8.java

9, interfaces

  • 1.
  • 2.
    Agenda • 概述 • 接口 • 接口实现 • 接口 - 多重继承 • 接口 - 命名冲突 • 接口 - 属性 • 接口与工厂方法 • 抽象类和方法
  • 3.
    概述 • 接口(interface) 和抽象类(abstract class)提供 了一种比实现类更为有效的方式, 用于实现 接口与实现的分离; • 接口 相比 抽象类, 是一种更高层次的抽象, 它声明了一种规范, 所有基于该接口的实现 类都必须实现该规范; • 本章将从接口介绍, 然后介绍抽象类.
  • 4.
    接口 • 使用interface关键字声明一个接口, 在接口中可 以定义static final属性和声明方法, 接口中没有 任何方法的实现; 示例: public interface InterfaceA { public static final int VALUE_ONE = 1; public void doSomething(); } • 不管是否作了声明, 接口中的属性默认是static final, 方法默认是public; • 接口本身的访问权限可以是public的, 也可以是 包访问权限; • 示例: demo/Demo1.java
  • 5.
    接口实现 • 使用implements关键字来实现一个接口, 如下: interface A void f1(); void f2(); implements implements class ClassA class ClassB void f1()... void f1()... void f2()... void f2()... • 接口中所有的方法默认都是public的, 即使不声 明为public; 子类在实现接口中声明的方法时, 必须将方法声明为public, 否则无法编译通过; • 示例: demo/Demo2.java
  • 6.
    接口 – 多重继承 •与C++不同的是, Java语言不支持同时继承多 个类; 但是java提供了接口, 一个类可以同时 实现多个接口; • 示例: demo/Demo3.java
  • 7.
    接口继承 • 在创建新的接口时, 可以继承自一个或者多 个接口, 新的接口将继承这些接口中所有的 方法声明; 比如: interface A {...} interface B extends A {...} interface C extends A, B {...} • 示例: demo/Demo4.java
  • 8.
    接口 – 命名冲突 •在同时实现多个接口时, 需要注意方法名称 冲突的问题; 比如: interface I1 { void f(); } interface I2 { int f(); } class C implements I1, I2 {...} // compile error • 在上面的例子中I1 和 I2接口均声明了方法f, 两者只是返回值不同; • 示例: demo/Demo5.java
  • 9.
    接口 – 属性 •可以在接口中声明属性, 接口中所有的属性无 论声明与否都是public static final的; 示例: // 在JDK5引入enum类型之前, 通常使用只包含属性声明的接口来达到类似效果 public interface Months { int JANUARY = 1, FEBRUARY = 2, MARCH = 3, APRIL = 4, MAY = 5 ...... • 接口属性必须在声明时进行赋值, 赋值可以使 非常量表达式, 示例: public interface RandVals { Random RAND = new Random(47); int RANDOM_INT = RAND.nextInt(10); long RANDOM_LONG = RAND.nextLong() * 10; ... • 示例: demo/Demo6.java
  • 10.
    接口与工厂方法 • 工厂方法(Factory Method)设计模式提供了除构 造器之外的另一种方式用于创建对象, 示例: class SomeObject {...} class SomeObjectFactory { SomeObject createObject() {...} } 其中createObject方法被称为工厂方法, 工厂方 法本身会调用constructor创建对象; • 接口与工厂方法: 工厂方法可以声明为返回某 个接口, 并根据不同的情况返回具体的实现类. 这样客户代码就可以与具体的实现完全解耦合. • 示例: demo/Demo7.java
  • 11.
    抽象类 和 方法 •抽象类是一种介于接口和实现类之间的抽象层 次, 抽象类可以包含抽象方法 和 具体方法; • 使用abstract class声明一个抽象类, 在方法声明 前加abstract用于声明一个抽象方法. 示例: public abstract AbstractClass { void concreteMethod() {...} abstract void abstractMethod(); } • 示例: demo/Demo8.java