Java9允许在接口中定义默认方法和类方法,为接口增加了一种私有方法,也可以提供实现。
接口就是定义一组通用的方法,就像U盘,只要是USB接口大部分都可以在电脑上使用,电脑无需关心U盘内部怎么实现,只需要告诉U盘厂商需要提供USB接口和一些对接方式即可。
接口里可以包含成员变量(只能静态成员变量)、方法(抽象实例方法、类方法、默认方法或私有方法)、内部类(包括内部接口、枚举)定义。
接口里定义的是多个类的共同的公共行为规范,定义接口的成员时只能用public访问权限或不写(默认就是public)
Java9为接口新增了一种新的私有方法,私有方法可以有方法体,主要作用就是工具方法,为接口中的默认方法和类方法提供支持。私有方法既可以是类方法,也可以是实例方法。
接口中的静态常量,它们是接口相关的,属于接口本身,所以默认有public static final修饰,且接口没构造器和初始化块,因此接口定义的成员变量只能在定义时指定默认值。
这两行代码结果完全一样。
int MAX=600;
public static final int MAX=600;
定义一个接口:
public interface Output {
int MAX_CACHE_LINE = 50;
void out();
void getData(String msg);
//默认方法
default void print(String... messages) {
for (String message : messages) {
System.out.println(message);
}
}
static String staticTest() {
return "接口里的类方法";
}
private void foo() {
System.out.println("foo私有方法");
}
private static void bar() {
System.out.println("bar私有静态方法");
}
}
默认方法并没有static修饰,因此不能直接用接口来调用默认方法,需要用接口实现类的实例对象来调用。
接口的默认方法其实就是实例方法,但是Java早期设计初衷:接口中的实例方法不能有方法体;Java8也不能直接推倒以前的规则,因此只好定义一个所谓的“默认方法”,其实就是有方法体的实例方法。
接口的继承
接口完全支持多继承,多个父接口排在extends关键字之后
接口继承的静态方法和静态常量问题:下面是一个类的继承:
class C {
public static int cc = 10;
public static void c() {
System.out.println("ccc");
}
}
class D extends C {
public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
System.out.println(D.class.getMethod("c"));
System.out.println(D.class.getField("cc"));
}
}
运行结果:
D类继承了C类后可以使用D的类名调用C类的静态方法和静态常量
下面是接口的继承:
interface A {
public static final int a = 10;
public static void aa() {
System.out.println("刀哥");
}
}
interface B extends A {
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
System.out.println(B.class.getField("a"));
System.out.println(B.class.getMethod("aa"));
}
}
运行结果:
这说明了接口的继承是不可以通过子接口的接口名直接调用父接口的静态方法,只能通过父接口(接口名.静态方法名)来调用