~1.接口中的静态方法
java8中允许通过static关键字定义静态方法,并在方法中定义方法体。接口中定义的静态方法在其他的类中可以通过“接口名.静态方法名”的方式被调用。
~2.接口中的默认方法
java8中定义方法时允许使用default关键字,在未加default关键字时,方法默认为abstract方法,则不能定义方法体,而在加了default关键字之后,可以在默认方法中定义方法体。注意,default关键字只允许在接口方法前显式定义,其实现类重写方法时不可以出现。
~3.接口的实现类
主要是两点:
java8接口定义中的静态方法可以通过接口名直接调用,而接口中已经实现了方法体的非静态方法只能通过其实现类的对象进行调用;
实现类的类名并不允许调用接口的静态方法。
【问题1】JDK8中允许接口中定义方法体,是不是意味着java中可以实现多继承了呢?
问题来源于接口中允许对方法的方法体进行定义,而java中仍然允许多实现(也就是允许一个类同时实现多个接口),那么换言之,这些特性的改变是不是意味着java也允许了多继承呢?
答案是否定的,可以做这样一个实验,多继承的缺点在于其存在不同父类具有同名方法时的调用危险,那么我们可以在两个接口内均完整定义两个同名default方法,当我们用一个类实现这两个接口时,会发现编译器报错,只用在实现类中重写了这个方法,报错才会消失。这说明:实现类实现的两个接口中如果包含有两个完全同名的default方法,必须对该方法名的方法进行重写。同样的,如果两个接口内定义了同名的静态方法,我们会发现根本不可以通过实现类调用接口的静态方法,更谈不上接口之间同名静态方法的冲突问题。综上,java8中并未实现多继承,只是通过接口特性的一些改变,对java的扩展性做出了一定的优化。但是,我们仍然要注意:尽量不要让一个类实现多个包含相同方法名的接口,这样没有太大意义。
【问题2】接口中的静态方法也可以被实现类重写么?
答案是可以进行重写,这样,在重写之后可以实现通过类名调用类的该静态方法的过程;如果不重写,实现类也是不能调用接口中的静态方法的。就像前面反复提到的,接口中的静态方法只能通过“接口名.静态方法名”的方式进行调用。换言之,这种所谓的重写也只是相当于为实现类多添加 了一个静态方法而已。