你不知道的Interface的骚操作

有一天,小A的朋友小呼面试回来,愁眉不展。

"难道面试不顺利?"小A心想。于是问小呼都问了什么。小呼说,面试官问了个奇怪的问题,

"Java的接口能不能定义静态方法"

小呼当时就内心一喜,这不是明摆着的问题嘛!

"当然不能,从来没听说过可以这么操作"

面试官微微一笑,

"好的回去等通知吧"

"难道我记错了?"小呼说。

"其实啊,你听我说…",于是小A跟小呼解释了起来

Java Interface的方法

总所周知,Java的Interface不能有静态方法,因为接口是用来规定一种约束,所以它自己本身不能有任何实现。不理解这点的同学可以查看昨天对于Java接口静态变量的解释。

但是!在Java8中,接口新增了特性,允许用户定义静态方法!

那么接口静态方法怎么用,又在什么时候用呢?

接口静态方法的作用

直到Java8之前,接口都不能定义静态方法。我们举个例子,产品提了个需求要做个计算器,只有加减两个方法。

public interface BaseCalculator {
  public int add(int a, int b);
  public int subtract(int a, int b);
}

我们先定义了个约束或者叫规范,这个计算器只提供加和减两个功能。然后我们实现了个类

public class SimpleCalculator implements BaseCalculator {

    @Override
    public int add(int a, int b) {
      //do add
    }

    @Override
    public int subtract(int a, int b) {
      //do substract
    }
}

产品上线后,获得了小学生的一致好评!

需求变更

产品说,我们来改需求吧。加个功能,求平方。

无奈的我们就加了个接口square

public interface BaseCalculator {
  public int add(int a, int b);
  public int subtract(int a, int b);
  public int square(int a);
}

可是此时就要修改实现类SimpleCalculator了。这种场景经常发生,代码量小的时候还好,但是当实现这个接口的类非常多的时候,没个文件都要去修改,新增一个接口,就很蛋疼了。而且!有些类根本不需要这个接口,咋办呀?

Java8提供了这种功能,可以定义个default方法作为默认实现,同时,接口也可以定义静态方法来给调用者使用了。

public interface BaseCalculator {
  public static void baseMethod() {
    System.out.println("static method of interface");
  }
  public int add(int a, int b);
  public int subtract(int a, int b);
  default int square(int a) {
    return a * a;
  }
}

这样之前的实现类SimpleCalculator就不需要再去修改了,而我们只需要在新的实现类里按我们的需要来重写default方法就行了。

总结

Java8提供了接口的两个新特性,静态方法和默认方法。 对于静态方法的调用跟接口的静态变量调用一样,都是以接口进行的。 对于默认方法,实现类可以根据需要来重写方法的实现。 对于面向接口编程来说,非常有用。可以避免对接口的修改导致大范围的而且是无必要的代码调整。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鹅厂优文

Python 工匠:编写条件分支代码的技巧

我一直觉得编程某种意义是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

1.1K10
来自专栏chafezhou

Python 工匠:编写条件分支代码的技巧

1524
来自专栏about云

hadoop开发必读:认识Context类的作用

问题导读: 1.Context能干什么? 2.你对Context类了解多少? 3.Context在mapreduce中的作用是什么? 本文实在能够阅读源码...

3504
来自专栏黑泽君的专栏

编码知识大杂烩

ASCII码 (American Standard Code for Information Interchange,美国标准信息交换代码),最原始最直观的表...

1074
来自专栏九彩拼盘的叨叨叨

如何给函数取个合适的名字

Quora 和 Ubuntu Forums thread 上的 4500 个程序员对上面的问题进行投票。49%的程序员认为给函数,变量等命名是最难的任务。

762
来自专栏嵌入式程序猿

号外号外:无规矩不成方圆(4)

本文MISRA规则由嵌入式程序猿整理自网络,版权归原作者所有 不能使用三字母词 三字母词由2 个问号序列后跟1 个确定字符组成(如, ??- 代表“ ~”(非)...

2715
来自专栏阮一峰的网络日志

Javascript编程风格

Douglas Crockford是Javascript权威,Json格式就是他的发明。 去年11月他有一个演讲(Youtube),谈到了好的Javascrip...

3596
来自专栏coding for love

JS入门难点解析2-JS的变量提升和函数提升

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

1333
来自专栏苦逼的码农

Hash冲突之开放地址法

比如说我的输入是任意一个自然数(0,1,2,3...),而我要求经过一个函数后我的输出的数的范围要在0-9这样一个范围之间。

6142
来自专栏用户2442861的专栏

C++ 智能指针详解

http://blog.csdn.net/xt_xiaotian/article/details/5714477

6611

扫码关注云+社区

领取腾讯云代金券