- 自限定型、枚举Enum<E extends Enum< E >>
- 反射、Class
- 接口中的所有方法自动地属于public,因此在接口中声明方法时,不必提供关键字public。但是在类中实现接口的时候一定要显式地将实现的方法声明为public
- 接口中不能包含有实例域,但是可以包含常量,并且接口中的域将被自动设为
public static final
- 接口不是类,所以我们不能实例化一个接口,但是我们可以声明接口的变量:
Comparable x;
并且接口变量只能够引用实现了接口的类对象:x=new Employe("Tom",10000);
- 如同使用instanceof来检查一个对象是否属于某个特定类一样,也可以使用instanceof检查一个对象是否实现了某个特定接口:
if(anObject instance Comparable) {...}
- 接口也可以被拓展,用
extends
关键字 - Java中可以多级继承,但是不存在多重继承
- 可以为接口提供一个默认实现,必须用default修饰符标记这样一个方法
默认方法的一个重要作用是接口演化,假如说库里面的某个接口添加了一个方法,但是之前继承过这个接口的类没有实现这个接口,那么就会无法编译。而我们添加了默认函数就可以避免这种事情,让旧的代码兼容新的jdk
//可能我们只需要关注前两个事件
public interface MouseListener{
default void mouseClicked(MouseEvent event) {}
default void mousePressed(MouseEvent event) {}
default void mouseReleased(MouseEvent event) {}
default void mouseEntered(MouseEvent event) {}
default void mouseExited(MouseEvent event) {}
- 接口冲突:如果先在一个接口中将一个方法定义为默认方法,然后又在超类或者另一个接口中定义了同样的方法,就会发生接口冲突,因为编译器不知道你要调用的是哪个方法。有两个原则:
超类优先:如果超类提供了一个具体方法,同名并且有相同参数类型的接口默认方法会被忽略
超接口冲突:如果一个超接口提供了一个默认方法,另一个接口提供了一个同名并且参数类型相同的方法,则必须覆盖这个方法来解决问题(编译器会报错)
我们来看一下第二种
interfce Named{
default String getName(){
return getClass().getName()+"_"+hashCode();
}
class Student implements Person,Named{
//要覆盖掉
public String getName(){
return Person.super.getName(); //指明用的哪一个就好了
}
}