1. 接口默认方法和静态方法
静态方法比较简单,就是用static修饰的方法,可以用接口名.方法名直接调用,不可重写。
默认方法就是接口里面写带有实现的方法(Java8之前接口中的方法必须是抽象的),而且该接口的实现类并不需要实现该方法,默认方法的书写形式只需要在方法名前面加个default关键字声明即可 。
2. 为什么要有这个新特性?
前的接口中,如果需要修改接口增加新方法的时候,如果该接口有N个实现类,则必须要重写该接口及其所有的实现类,即使该实现类用不上这个新方法,也必须显式的实现该接口填充空的方法体内容。所以默认方法的目的是为了解决接口的修改与现有的实现不兼容的问题。以Java8为例,Java8之前的集合框架没有foreach方法(参看集合顶级接口Iterable
),通常能想到的解决方法就是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现,所以引进了默认方法。
3. 代码Demo
Car.java
1import org.slf4j.Logger;
2
3/**
4* @author gnehcgnaw
5* @date 2018/10/11 11:29
6*/
7public interface Car {
8/**
9* @Slf4j 不能在接口中使用,因为接口中要求都是public ,而@Slf4j其实是:
10* private static final Logger log = org.slf4j.LoggerFactory.getLogger(DFCar.class);
11* 因为1.8新特性的原因,接口中有可能也有日志的产生,所以可以使用
12* public static final Logger log = org.slf4j.LoggerFactory.getLogger(DFCar.class);
13*/
14public static final Logger log = org.slf4j.LoggerFactory.getLogger(DFCar.class);
15
16void run ();
17/**
18* 默认方法
19* @return
20*/
21default int printWheelSum(){
22return 4;
23}
24
25/**
26* 可以有多个默认方法
27* @param i
28* @return
29*/
30default int printWheelSum(int i){
31/*
32* 原来不能在接口中使用this关键词,1.8及之后现在可以了,因为this需要的是非静态方法的环境
33*/
34int wheelSum = this.printWheelSum();
35log.info("接口中的default方法调用本接口中其他default方法{}",wheelSum);
36return i ;
37}
38
39/**
40* 静态方法
41* @return
42*/
43static String printColour(){
44return "red" ;
45}
46}
DFCar.java
1import lombok.extern.slf4j.Slf4j;
2
3/**
4* @author gnehcgnaw
5* @date 2018/10/11 11:32
6*/
7@SuppressWarnings("all")
8@Slf4j
9public class DFCar implements Car {
10
11@Override
12public void run() {
13log.info("东风汽车跑得快!!!");
14}
15
16@Override
17public int printWheelSum() {
18/*
19*1.8及以后实现类可以调用接口中的default方法,使用方式是:接口.super.方法
20*/
21log.info("{}", Car.super.printWheelSum());
22return 5;
23}
24/**
25* 默认方法也可以不被实现
26*/
27/* @Override
28public int printWheelSum(int i) {
29return 0;
30}*/
31static String printColour(){
32return "blue" ;
33}
34}
Main.java
1import lombok.extern.slf4j.Slf4j;
2
3/**
4* @author gnehcgnaw
5* @date 2018/10/11 13:37
6*/
7@Slf4j
8public class Main {
9public static void main(String[] args) {
10/**
11* 接口中的静态方法可以在其他静态方法中直接使用:接口.静态方法 ,直接调用。
12* 而且静态方法不能被子类重写
13*/
14String car_colour = Car.printColour();
15log.info("接口中的静态方法执行结果为:{}" ,car_colour);
16
17String dfCar_colour = DFCar.printColour();
18log.info("实现类中的静态方法执行结果为:{}" ,dfCar_colour);
19
20/**
21* 接口中的default方法被重写之后,是不是就不能调用到接口中的default方法了呀
22*/
23Car car1 = new DFCar();
24int car1_wheelSum = car1.printWheelSum();
25log.info("{}",car1_wheelSum);
26
27DFCar car2 = new DFCar();
28int car2_wheelSum = car2.printWheelSum(3);
29log.info("{}",car2_wheelSum);
30
31}
32}
文章转载自程序猿wangc,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




