接口中的默认方法
什么是接口的默认的方法
interface My{
default void test(){
}
}
由上可知默认方法是被default关键字修饰的方法,该方法是有方法体,并且该方法是可以不被接口的实现类重写的
那么JDK1.8为什么新添加默认方法:
都知道接口定义的方法如果是抽象的那么就会在实现类中重写全部抽象方法,但是当我们想要对该接口进行扩展,添加新功能,那么在1.8之间只能定义抽象方法,这样导致了实现了这个接口的全部类都要重写这个方法,导致了很多麻烦,而JDK1.8之后新添加了默认方法,可以定义新的默认方法来对该接口进行扩展,而且不用在实现类中重写该方法
//定义一个接口
interface My{
void test();
}
接口中的注意事项
-
接口的抽象方法的修饰符必须是public abstract,可以不写并且抽象方法是没有方法体的
-
如果一个实现类只实现了一个接口,那么可以不用重写接口中的默认方法
-
如果一个实现类实现了多个接口,并且这些接口中有两个接口的默认方法是一样的,那么就必须在实现类中重写默认方法
-
实现接口的类必须重写接口中的抽象方法
public class Test implements My{ @Override public void test() { } }
-
如果实现类中并没有全部重写接口中的方法,那么这个类是抽象类
abstract class You implements My{ }
-
接口默认方法修饰符是public default,并且有方法体,如果不写default,那么默认就会判断为抽象方法,所以,接口中的默认方法必须写default。
interface My{ public void test(); default int add(int a , int b){ return a+b; } }
-
默认方法可以通过接口的实现对象直接调用,可以被接口的实现类重写
public class Test implements My{ //重写接口中的默认方法 @Override public int add(int a, int b) { return 0; } public static void main(String [] args){ //实例化接口的实现类 Test t3 = new Test(); //通过接口实现类调用接口的默认方法 System.out.println(t3.add(1,2)); } }
-
接口的静态方法是在接口中用static修饰的方法,访问修饰符可以不写,但是只能是public修饰,同时可以直接使用接口名称直接调用静态方法,不可以用实现类来调用
interface My{ public static int sub(int a , int b){ return a-b; } } public class Test{ public static void main(String[] args){ My.sub(2,1); } }
-
接口也可以定义成员变量,但必须使用public static final修饰符并且必须赋值(如果使用其他的访问修饰符,那么就会报错,如果不写访问修饰符,那么就是以public修饰)
-
接口类不能有静态代码块、构造方法和匿名代码块
-
如果实现类有多个并且实现的抽象方法名称是一样的,那么重写一次即可
-
如果实现类有多个并且实现的默认方法名称是一样的,那么重写一次即可
-
继承的优先级大于实现的优先级,即调用了一个方法,该方法没有被重写,但是在父类和接口中都有相同方法名的方法,那么调用该方法时,优先使用父类中的方法
-
接口与接口之间是多继承,也就是说接口类可继承多个接口父类
-
JDK1.9中接口可以有私有方法