-
Notifications
You must be signed in to change notification settings - Fork 0
interface
wzs edited this page Aug 27, 2018
·
1 revision
接口, 在 Java 中是一个抽象类型, 用来统一类的共通特性, 描述类的行为和功能; 但接口不需要也不允许实现这些行为和功能
- 接口只能包含方法签名和常量声明, 不能包含方法实现
- 常量声明是指 final/static 常量.
接口可以理解为双方为了交流而做出的约定: 只要实现该接口, 就有该接口的方法和常量的定义和实现.
接口有以下特性
- 接口类型无法被实例化, 但是可以被实现: 一个实现接口的类, 必须实现接口的所有方法, 否则该类必须声明为抽象类.
- 接口类型无法被实例化, 但是接口可以使用接口声明一个空指针, 然后被绑定到实现该接口的类上
- 接口无法实现其他的接口.
接口的优势
- 隐藏具体实现
- 在 Java 中, 是不允许多继承的, 既一个类最多只能有一个父类, 但是可以使用接口模拟 '多继承'(一个类可以 implement(实现) 多个接口)
-
java.lang.Object
是例外, Object 是顶层类型, 没有父类.
-
隐藏具体实现: 比如函数返回一个 interface, 那么你只能通过 interface 里面的方法来做一些操作, 但是内部的具体实现是完全不知道的.
context 最先由 google 提供, 现在已经纳入了标准库, 而且在原有 context 的基础上增加了: cancelCtx, timerCtx, valueCtx. 如下代码, 表面上 WithCancel 函数返回的还是一个 Context interface, 但是这个 interface 的具体实现是 cancelCtx struct. 既隐式更改了context的具体实现.
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
c := newCancelCtx(parent)
propagateCancel(parent, &c)
return &c, func() { c.cancel(true, Canceled) }
}
- go 语言的 interface 只能有方法, 不能有常量, java 中的接口中可以有静态常量, 也可以定义变量
- go语言的接口是非侵入式的, 既接口实现者(struct)不需要显示implement接口
interface ITest{
int a = 3; // 等效于 final int a = 3;
void printa();
static int b =3;
}
class Test implements ITest{
public void printa(){
System.out.println(this.a);
}
}