接口interface

接口,比抽象类还要抽象的类:

  1. 接口中的方法会被隐式的指定为 public abstract (只能是 public abstract,其他修饰符都会报错)。
  2. 接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。)
  3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

定义接口

定义接口不再使用class关键字,而是interface

1
2
3
4
5
6
[修饰符] interface 接口名 extends 父接口1,父接口2...{
常量
抽象方法
内部类、接口、枚举
方法
}

接口中的成员变量始终默认添加public static final修饰符

1
2
3
4
5
public interface interfaceTest {
// 成员变量始终添加public static final修饰符
String name = "默认";
// 等同于public static final String name = "默认";
}

接口中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public interface interfaceTest {
// 抽象方法methods(),默认添加public abstract
void methods();

// j8开始允许有static方法,所以接口可以直接运行,可以省略访问权限控制符不写,默认添加public
static void main(String[] args){
System.out.println("Hi~");
}

// 若要创建默认方法,就得把static改成default,default并无实际作用,仅用于抵消abstract
// 接口的默认方法其实就是实例方法,由于早期接口中的实例方法不能有方法体不能直接推到
default void test(){
System.out.println("实例方法");
this.test2();
}

// 私有方法
private static void foo(){
// 从java9开始,接口允许私有静态方法
}
private void bar(){
// 从java9开始,接口允许私有默认方法
}
}

接口的继承

接口支持多继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public interface inter1 extends inter2,inter3,inter4{

}
interface inter2{

}

interface inter3{

}
interface inter4{

}


接口不能显式继承任何类(隐式继承Object)

类使用接口

1
2
3
public class 类名 extends 父类 implements 接口1,接口2,接口3{
// 与继承父类一样,可以获得接口内的常量、方法
}

使用接口的类必须重写接口的全部抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class public_test implements interfaceTest {
public static void main(String[] args) {

}
@Override
public void main2(){

}
}
interface interfaceTest {
void main2();
default void main3(){
// 非抽象方法,不必须重写
}
}

接口和抽象类

相同

  1. 都不能被实例化
  2. 都可以包含抽象方法

不同

  1. 接口只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供实现;抽象类可以包含普通方法
  2. 接口只能定义静态常量,不能定义普通成员变量;抽象类能定义静态常量,也能定义普通成员变量
  3. 接口不包含构造器;抽象类可以包含构造器,用于让子类调用构造器完成初始化操作
  4. 接口不能包含初始化块;抽象类能包含初始化块
  5. 一个类只能继承一个类;一个类可以实现多个接口