jdk8 新特性 default

371 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

default修饰符

为什么要有默认方法?

当接口需要增加一个方法,那么所有它的实现类都需要实现这个方法,改动会很大.

使用defalut修饰后,可以直接在接口中实现方法.默认所有实现类都实现了这个方法,对于需要实现这个方法的实现类可以重写这个方法.

例子

在接口中,可以使用defalut修饰方法,实现方法体

public interface defalutInterface {

    void getName();

// 使用default 可以实现方法体
    default void getNames() {
        System.out.println("name");
    }
}

实现类可以不用实现default修饰的方法,直接继承并使用.

public static void main(String[] args) {
        defaultClass defaultClass = new defaultClass();
				// 不实现可以直接调用
        defaultClass.getNames();
				// 输出name
    }
}

实现类可以重写方法

@Override
    public void getNames() {
        System.out.println("className");
}

// 输出从className

冲突问题

💡 接口继承多接口 / 实现类多实现
public interface animals {
    default void eat() {
        System.out.println("动物吃饭");
    }
}

public interface people {
    default void eat() {
        System.out.println("人吃饭");
    }
}

image.png

当实现多个接口,这几个接口都有一个同名的默认方法.那么系统就会不知道该实现哪一个,报错,就需要重写

这种选择情况其实和多继承的选择问题比较类似(当然java不允许多继承,可能也有这方面的考虑);

image.png

实习类实现同的问题,需要重写

image.png

优先级

1.default方法优先于接口普通方法:当子接口的defalut方法名和父接口的普通/default方法名重名,父类方法失效

2.实现类的父类继承的方法优先于接口的default方法:当父类的继承方法和接口的默认方法同名,父类的方法优先.

综上来看:实现的方法优先于抽象方法,实现类优先于接口