新增接口方法
概述
JDK1.8之前,接口中的方法都必须是抽象方法,实现接口的类,必须实现接口中定义的每一个抽象方法。因此出现了一个问题,如果在程序设计过程中,设计了一个接口,其中包含两个方法,这个接口被多次实现并引用,在后续升级过程中,发现需要在接口中新增多个方法的定义,那么实现该接口的类也必须重写该接口中所有的方法吗?
为了解决该问题,JDK1.8中引入了一种新的机制:接口可以支持在声明方法的同时,提供实现。用到的方式就是在接口中定义默认方法和静态方法。实现含有默认方法或者静态方法的接口的类可以继承这些方法并直接使用,不再需要强制在实现类中去实现(重写)接口中的方法了。
默认方法
interface Firstinterface{
void before();
default void test(){
System.out.println("Default默认方法被调用了");
}
}
class FirstClass implements FirstInterface{
@override
public void before(){
Systemo.out.println("实现类中的抽象方法被调用了");
}
}
public class DefaultMethod{
public static void main(String[] args){
FirstClass fc = new FirstClass();
fc.test();
fc.before();
}
}
默认方法的优势
1、升级接口(添加方法声明)可以更加方便。不必随着接口方法增加,从而修改实现代码,因为默认方法在子类中可以不用实现。 2、可以让实现类中省略很多不必要方法的空实现。
接口继承及使用默认方法可能带来的冲突
默认方法调用的规则
Java中一个类只能继承一个父类,但是可以实现多个接口。由于Java 8中,接口里面的方法可以直接进行实现,那么类也就可以从多个接口中继承这些方法。
规则如下:
- 1、类中声明的方法优先级最高。类或方法中,声明的方法要高于任何默认方法的优先级
- 2、如果无法依据第一条进行判断,那么子接口的优先级更高
- 3、如果还是无法判断,那么继承了多个接口的类,必须通过实现(重写)方法来确定方法的调用
(1)例如:类C,实现两个接口A、B,其中接口B继承接口A
interface A{
default void test(){
System.out.println("A接口中的Default方法");
}
}
interface B extends A{
default void test(){
System.out.println("B接口中的default方法");
}
}
class C implements A,B{
public static void main(String[] args){
C c = new C();
c.test();
}
}
运行结果:B接口中的default方法 //子接口的优先级最高,所以是调用B接口的默认方法
(2)例如:类C,继承父类A,实现接口B
class A{
public void test(){
System.out.println("A类中的Default方法");
}
}
interface B { ‘
default void test(){
System.out.println("B接口中的Default方法");
}
}
class C extends A implements B{
public static void main(String[] ar gs){
C c = new C();
c.test();
}
}
A类中的Default方法
(3)例如,类C,实现两个接口A、B,但是A和B之间没有子父接口关系
interface A{
default void test(){
System.out.println("Default Method test in A");
}
}
interface B {
default void test(){
System.out.println("default method test in B")
}
}
class C implements A,B{
public void test(){
A.super.test();
B.super.test();
}
}
静态方法
和类中定义的静态方法类似,**接口中的静态方法可以直接通过 接口名.静态方法名 的形式进行访问。**接口中的静态方法,只能使用当前接口的名字来调用。
public interface StaticMethod{
public static void test(){
System.out.println("我是StaticMethod接口中的静态方法!");
}
}
class A implements StaticMethod{}
class Test{
public static void main(String args[]){
StaticMethod.test();
}
}
|