Java接口

接口学得我懵逼了,总结一下

趁着刚学完,做个笔记以后好回忆

接口定义

格式如下

1
2
3
4
5
6
7
8
9
public interface myInterface{
public abstract void methodAbs1();

abstract void methodAbs2();

public void methodAbs3();

void methodAbs4();
}

接口的方法必须有 public abstract 两个关键词修饰
但这两个关键词可以省略
以上四个都是抽象方法

使用

1
2
3
4
5
6
7
public class myInterfaceImpl implements myInterface{
@Override
public void methodAbs1() {
System.out.println("first method");
}
...
}

接口不能直接使用,必须先实现类来实现该接口
接口必须覆盖重写(实现)接口中所有的抽象方法
如果实现类没覆盖重写所有的抽象方法,否则自己必须是抽象类

接口常量

就是接口里的“成员变量”,必须用 public static final 修饰
可以省略 public static final ,不写效果一样
格式

1
2
3
public interface myInterface{
public static final NUM = 10;
}

建议常量全部大写,用下划线分隔

接口静态方法

格式就是把abstract或者default换成static

1
2
3
4
5
public interface myInterface{
public static void method(){
...
}
}

和静态方法的用法一样直接接口名称调用

1
2
3
4
5
public class test{
public static void main(String[] args){
myInterface.method();
}
}

接口默认方法

用以解决接口升级的问题,接口定义了 default 修饰的方法后,使用接口的类可以直接使用,不需要覆盖重写,也可以覆盖重写

1
2
3
4
5
public interface myInterface{
public default void method(){
...
}
}

使用

1
2
3
public class demo implements myInterface {
...
}
1
2
3
4
5
6
public class test {
public static void main(String[] args){
demo one = new demo();
one.method();
}
}

默认方法就是在定义接口的时候实现的方法,继承它的类可以选择覆盖重写,或者不管
这些类实现的对象可以使用这些默认方法

接口私有方法

当定义默认接口的时候,会出现重复的代码块,这时候就可以把这些代码块提取出来放在一个方法里面,需要用的时候直接调用就可以了
但这些方法只能允许本接口中这些默认方法使用,所有可以给这些方法修饰为私有(private)方法
格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface myInterface{
public default void methodA(){
...
play();
}

public default void methodB(){
...
play();
}

private void play(){
...
}
}

play 方法只允许本接口中的方法使用,别的地方都不能使用

接口私有静态方法

接口中的静态方法也会有重复的代码块,这时候也可以把它提取出来放在一个方法里面,由于这些方法是静态的,所有这个代码块也要是静态的,又因为不想让这个代码块再别的地方用,再给它加个私有(private)的修饰
格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface myInterface{
public static void methodA(){
...
play();
}

public static void methodB(){
...
play();
}

private static void play(){
...
}
}

使用

1
2
3
4
5
6
7
8
public class test{
public static void main(String[] args){
myInterface.methodA();
myInterface.methodB();

//myInterface.play(); //这是不允许的
}
}

一个类只能有一个父类,但可以有多个接口

实例

1
2
3
public class test implements myInterfaceA, myInterfaceB{
...
}
  • 如果实现类有多个接口中,存在重复的抽象方法,那么只需要覆写一次就可以了
  • 如果实现类没有覆盖重写所有接口的所有抽象方法,那么实现类必须是一个抽象类
  • 如果多个接口中存在重复的默认方法,那么实现类必须覆盖重写默认方法
  • 如果父类中的方法和接口中的默认方法产生冲突,优先用父类中的方法

懵逼中,总结了一下后,感觉好多了(´・_・`)