接口的细节1、接口中的变量2、接口的继承3、类的继承与接口4、instanceof5、使用接口替代继承6、Java 8和Java 9对接口的增强1、接口中的变量接口中可以定义变量语法如下所示publicinterfaceInterface1{publicstaticfinalinta0;}这里定义了一个变量int a修饰符是public static final但这个修饰符是可选的即使不写也是public staticfinal。这个变量可以通过“接口名变量名”的方式使用如Interface1.a。2、接口的继承接口也可以继承一个接口可以继承其他接口继承的基本概念与类一样但与类不同的是接口可以有多个父接 口代码如下所示publicinterfaceIBase1{voidmethod1();}publicinterfaceIBase2{voidmethod2();}publicinterfaceIChildextendsIBase1,IBase2{}3、类的继承与接口类的继承与接口可以共存换句话说类可以在继承基类的情况下同时实现一个或多个接口语法如下所示publicclassChildextendsBaseimplementsIChild{//主体代码}关键字extends要放在implements之前。4、instanceof与类一样接口也可以使用instanceof关键字用来判断一个对象是否实现了某接口例如PointpnewPoint(2,3);if(pinstanceofMyComparable){System.out.println(comparable);}5、使用接口替代继承继承至少有两个好处一个是复用代码另一个是利用多态和动态绑定统一处理多种不同子类的对象。使用组合替代继承可以复用代码但不能统一处理。使用接口替代继承针对接口编程可以实现统一处理不同类型的对象但接口没有代码实现无法复用代码。将组合和接口结合起来替代继承就既可以统一处理又可以复用代码了。先增加一个接口IAdd代码如下publicinterfaceIAdd{voidadd(intnumber);voidaddAll(int[]numbers);}修改Base代码让它实现IAdd接口代码基本不变publicclassBaseimplementsIAdd{privatestaticfinalintMAX_NUM1000;privateint[]arrnewint[MAX_NUM];privateintcount;publicvoidadd(intnumber){if(countMAX_NUM){arr[count]number;}}publicvoidaddAll(int[]numbers){for(intnum:numbers){add(num);}}}修改Child代码也是实现IAdd接口代码基本不变publicclassChildimplementsIAdd{privateBasebase;privatelongsum;publicChild(){basenewBase();}publicvoidadd(intnumber){base.add(number);sumnumber;}publicvoidaddAll(int[]numbers){base.addAll(numbers);for(inti0;inumbers.length;i){sumnumbers[i];}}publiclonggetSum(){returnsum;}}Child复用了Base的代码又都实现了IAdd接口这样既复用代码又可以统一处理还不用担心破坏封装。6、Java 8和Java 9对接口的增强需要说明的是前面介绍的都是Java 8之前的接口概念Java 8和Java 9对接口做了一些增强。在Java 8之前接口中的方法都是抽象方法都没有实现体Java 8允许在接口中定义两类新方法静态方法和默认方法它们有实现体比如publicinterfaceIDemo{voidhello();publicstaticvoidtest(){System.out.println(hello);}defaultvoidhi(){System.out.println(hi);}}test()就是一个静态方法可以通过IDemo.test()调用。在接口不能定义静态方法之前相关的静态方法往往定义在单独的类中比如Java API中Collection接口有一个对应的单独的类Collections在Java 8中就可以直接写在接口中了比如Comparator接口就定义了多个静态方法。hi()是一个默认方法用关键字default表示。默认方法与抽象方法都是接口的方法不同在于默认方法有默认的实现实现类可以改变它的实现也可以不改变。引入默认方法主要是函数式数据处理的需求是为了便于给接口增加功能。在没有默认方法之前Java是很难给接口增加功能的比如List接口​因为有太多非Java JDK控制的代码实现了该接口如果给接口增加一个方法则那些接口的实现就无法在新版Java上运行必须改写代码实现新的方法这显然是无法接受的。函数式数据处理需要给一些接口增加一些新的方法所以就有了默认方法的概念接口增加了新方法而接口现有的实现类也不需要必须实现。看一些例子List接口增加了sort方法其定义为defaultvoidsort(Comparator?superEc){Object[]athis.toArray();Arrays.sort(a,(Comparator)c);ListIteratorEithis.listIterator();for(Objecte:a){i.next();i.set((E)e);}}Collection接口增加了stream方法其定义为defaultStreamEstream(){returnStreamSupport.stream(spliterator(),false);}在Java 8中静态方法和默认方法都必须是public的Java 9去除了这个限制它们都可以是private的引入private方法主要是为了方便多个静态或默认方法复用代码比如publicinterfaceIDemoPrivate{privatevoidcommon(){System.out.println(common);}defaultvoidactionA(){common();}defaultvoidactionB(){common();}}这里actionA和actionB两个默认方法共享了相同的common()方法的代码。