Java - Interfaces
本文参考oracle_interface 和 tutorialspoint_interface
interface是一种特殊的abstract类,描述的是一种“契约”。
The
interface
keyword produces a completely abstract class, one that provides no implementation at all.
——《Java编程思想,第4版》
接口和类的不同点:
- 接口不能进行实例化。
- 接口没有构造函数。
- 接口中不能包含实例域(instance fields),其域(fields,变量)只能是
static
且final
的。 - 接口中的方法(methods)都是抽象(abstract)的。也就是说,接口不能像抽象类那样保有一般的方法。
- 接口被类实现而非继承,An interface is not extended by a class; it is implemented by a class.
- 一个类只能继承(extends)一个父类(具体类或抽象类),但能实现(implements)多个接口。一个接口可以继承(extends)多个接口。
- 关于 继承extends 和 实现implements:类继承类,接口继承接口,类实现接口。
申明接口(Declaring Interfaces)
interface
关键字:
public interface NameOfInterface {
// Any number of final, static fields
// Any number of abstract method declarations
}
申明接口时,有如下默认特性:
- 接口,默认是
abstract
的,因此申明接口时的abstract
关键字可以省略。 - 接口中的方法(methods),默认也是
abstract
的,因此申明方法时的abstract
关键字也可以省略。 - 接口中的常量,默认是
public static final
的,因此可以省略这些关键字。 - 接口中的方法,默认是
public
的,因此可以省略这个关键字(Allabstract
,default
, andstatic
methods in an interface are implicitlypublic
)。
接口中的方法,可以有三种, abstract methods, default methods, 和 static methods,参考这里:
- abstract methods:抽象方法,只有申明,没有实现(即函数签名后直接分号结束,没有函数体)。接口中的方法,若没有被申明成 default 或 static 的,那默认就是 abstract 方法。
- default methods:被
default
修饰的方法。 - static methods:被
static
修饰的方法。
例如:
interface MyInterface {
double PI = 3.14159; // 是常量(因此必须初始化),默认是public static final的
void eat(); // 方法,默认是public abstract的,相应地导致接口MyInterface也成为abstract的
void sleep();
}
实现接口(Implementing Interfaces)
实现(implements)接口的例子:
/* 接口,在被implements时,要么接口中的抽象方法必须被子类实现,要么把子类申明成抽象的。这和抽象类一样 */
interface MyInterface {
String hi = "Hi";
void sayhi();
}
/* 第一种:接口中的抽象方法必须实现,否则编译时报错 */
class MyClass1 implements MyInterface {
// The type MyClass1 must implement the inherited abstract method MyInterface.sayhi()
@Override
public void sayhi() {
// do something
}
}
/* 第二种:把子类也申明成抽象的,否则编译时报错 */
abstract class MyClass2 implements MyInterface {
}