以前我们知道,接口中的方法必须时抽象方法,而从 java8 开始接口中也可以有方法的实现了,叫做默认方法。

一 、默认方法(default修饰)

  在 java8 中,因为存在函数式接口,一个接口中只能存在一个普通方法,但是可以写多个默认方法,来为实现类提供方法实现。

 public interface MyInterface {

     /**
* 默认方法
* @return
*/
default String getName () {
return "张三";
} default String getAge () {
return "13";
} /**
* 普通方法
* @return
*/
String getHome ();
}

  既然接口中可以写方法的实现,那么就会出现与父类之间进行冲突的问题。

 public class MyClass {

     public String getName () {
return "李四";
}
}

  上面的类中同样存在一个方法 getName 如果有一个类即实现 MyInterface 的接口, 又继承 MyClass 的类,那么这个类的 geName 方法到底使用接口中的还是父类中的呢?

 public class My_JAVA8_Test extends MyClass implements MyInterface{

     public static void main(String[] args) {
My_JAVA8_Test test = new My_JAVA8_Test();
System.out.println(test.getName());
} @Override
public String getHome() {
return null;
} }

  答案是“李四”,因为,这里有一个类优先的原则:

    若一个接口中定义了一个默认方法,而另一个父类中又定义了一个同名方法时,选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。

  如果,此时,我们再定义一个接口,里面也有一个方法叫做getName,而一个类去同时实现这两个接口。那么这个类的 getName 方法到底会执行哪一个呢?

 public interface MyFun {

     default String getName () {
return "王五";
}
}
 public class My_JAVA8_Test implements MyInterface, MyFun{

     public static void main(String[] args) {
My_JAVA8_Test test = new My_JAVA8_Test();
System.out.println(test.getName());
} @Override
public String getHome() {
return null;
} /**
* 此时,类会让我们自己去重写,也可以自己选择使用上面2个接口中的方法
*/
@Override
public String getName() {
return MyFun.super.getName();
} }

  此时,类会让我们自己去重写,也可以自己选择使用上面2个接口中的方法

  若一个接口中定义了一个默认方法,而另外一个接口中又定义了一个同名方法时,接口冲突。不管是否是默认方法,那么必须覆盖该方法来解决冲突。

二、静态方法

  在 java8 中的接口中不仅增加了默认方法,还增加了静态方法。使用方式接口名.方法名。

 public interface MyFun {

     default String getName () {
return "王五";
} static void test () {
System.out.println("测试接口中静态方法!");
}
}
     public static void main(String[] args) {
MyFun.test(); }

java8新特性——接口中的静态方法与默认方法的更多相关文章

  1. Java8新特性-接口中的静态方法与默认方法

    今天上午在读<Effective Java>时,有这样一句话:”接口中“不能有静态方法,于是联想起面试时老是被问接口相关的东西,决定总结一下,谁知道这一总结,就发现了自己知识的一大漏洞.  ...

  2. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  3. jdk1.8新特性 : 接口中可以有普通方法(非静态方法)和静态方法 , 颠覆了之前我的理解 : 接口中只能有共有常量和抽象方法的概念,后面必须要加一句jdk1.7和1..7之前

    看到jdk某些接口中存在default方法,于是... http://shaomeng95.iteye.com/blog/998820    为什么接口只能是公有常量? public interfac ...

  4. JAVA8新特性——接口定义增强

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法 ...

  5. Java8新特性interface中的static方法和default方法

    static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...

  6. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  7. Java8新特性——接口默认方法

    Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为什么要有这个特性? 首先 ...

  8. Java8新特性——接口的默认方法和类方法

    Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只 ...

  9. Java 8 新特性-菜鸟教程 (4) -Java 8 默认方法

    Java 8 默认方法 Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为 ...

随机推荐

  1. python常用函数库及模块巧妙用法汇总

    在用python编写脚本或写程序过程中总要遇到一些对大文件或数据进行排序,计算,循环跌代等.我想下面这些函数库一定能用得到,总结如下:便于以后备查 列表去重(传说是列表去重最高效的方法): al = ...

  2. spring boot(二):注解大全

    spring boot注解 @Autowired 注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去. ...

  3. JavaScript Promises 实现框架一览及对比

    In my previous post in Danish I looked at how to perform asynchronous calls by using promises. Now t ...

  4. tf.reduce_sum()_tf.reduce_mean()_tf.reduce_max()

    根据官方文档: reduce_sum应该理解为压缩求和,用于降维 tf.reduce_sum(input_tensor,axis=None,keepdims=None,name=None,reduct ...

  5. SpringMVC可以配置多个拦截后缀*.action和.do等

    首先介绍一下.do和.action的区别: struts早期的1版本,以.do为后缀. 同时spring的MVC也是以.do为后缀. 几年前struts收购鼎鼎大名的webwork2和开发团队后,将w ...

  6. Qualcom QMI系列-基本知识介绍(转)

    1 引言1.1 编写目的       介绍Qualcom QMI 基本知识,API使用,设计原理,基于QMI的RemoteEfs(NV)分析1.2 阅读建议       高通平台入门1.3 参考资料 ...

  7. 64_p8

    python2-cotyledon-tests-1.6.7-2.fc26.noarch.rpm 12-Feb-2017 10:28 23182 python2-couchdb-1.0-6.fc26.n ...

  8. Class.this 和 this 的有什么不同

    转载:http://www.cnblogs.com/liwei45212/archive/2013/04/17/3026364.html 在阅读Java代码的時候 我们时会看到Class.this的使 ...

  9. java基础11 继承(super、extends关键字和重写,这三个要素出现的前提:必须存在继承关系)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  10. 关于VS2010的一些操作

    自动插入接口实现 1: class MyClass : IMyInterface 2: { 3:   4: } .csharpcode, .csharpcode pre { font-size: sm ...