zoukankan      html  css  js  c++  java
  • 纳尼,java可以在接口中实现非抽象方法了?

    纳尼,接口中可以定义实例方法了?!

    纳尼,接口中还可以定义静态方法了?!

    没错,在Java8中新增了很多新的特性,其中就包括可以在接口中添加方法和变量。

    首先我们来看下代码

     1 public interface SourceInterface 
     2 {
     3     int a = 5;
     4     int b = 10;
     5 
     6     public static int add() 
     7     {
     8         return a + b;
     9     }
    10 
    11     public static void reset() 
    12     {
    13         // do sth
    14     }
    15 
    16     public default int f1()
    17     {
    18         return a;
    19     }
    20 
    21     public default void f2()
    22     {
    23         // do sth
    24     }
    25 }
    26 
    27 class learnCode
    28 {
    29     public void userInterface()
    30     {
    31         int xx = SourceLearning.add();
    32         SourceLearning.reset();
    33         SourceLearning instance = new SourceLearning()
    34         {
    35             @Override
    36             public void f2()
    37             {
    38                 // do sth 、
    39             }
    40         };
    41         instance.f1();
    42         instance.f2();
    43         //int y=instance.add(); 注意这句会编译错误
    44     }
    45 }

    代码中,我们可以发现以下几点不同:

    1、在接口中,可以直接添加静态方法。

    该静态方法作为接口(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )的类方法,可以直接使用。不需要依托某个实现类。

    2、在接口中,可以直接添加非抽象的实例方法。

    在实例方法的申明中,需要增加default关键字修饰,因此这种方法也称为默认方法。他是接口自带的方法。接口被实现后,实例可以直接使用这些默认方法,同时如果对默认方法需要重写时,可以直接重写即可。

    这两点新特性相对于java8之前的版本来说,可以说有质的改变。

    引申:

    可以增加方法的接口,开始变的更像抽象类。Java类在实现了多个拥有默认方法的接口后,从侧面展现的像是实现了多重继承的影子。

    注意:如果两个接口的默认方法出现重复申明,则需要在实现方法中重写该方法,否则jvm在执行时,无法确定究竟应该使用哪个接口的同名方法。这应该可以算是本次新引入特性的一个弊端,如果是指定使用的是某个接口中的默认方法时,可以采用

    1 @Override
    2 public void f2()
    3 {
    4     SourceLearning.super.f2();
    5 }

    的形式

    那么,java为什么要引入默认方法呢?如果需要往接口中添加方法,直接使用抽象类即可,为什么要破坏已有的约定呢?

    我认为主要原因如下:

    在面向接口的编程过程中,发现原有的接口中,都需要添加一个相同的方法,那么现在有两种方案:

    1)接口换抽象类,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )抽象类中添加该方法

    2)接口中添加该抽象方法,在每一个接口的实现类中,均添加相同的实现方法。

    无论选择哪种方法,都需要对已有的代码做出非常大的改动。可是如果使用默认方法,使对接的接口默认就拥有某些功能的实现,则很好的解决了假设的问题。

  • 相关阅读:
    最小生成树+BFS J
    Noip 2016
    舒适的路线 (code[vs] 1001)
    拦截导弹 (加了神奇的位运算)
    逃出克隆岛 (codevs 2059)
    回家(洛谷 P1592)
    热浪
    城堡
    笔记 (一道正解思路巧妙的题)
    脱水缩合
  • 原文地址:https://www.cnblogs.com/jilodream/p/5786036.html
Copyright © 2011-2022 走看看