之前Java接口中的方法默认都是public abstract,成员变量默认都是public static final,偶然发现接口中可以有default类型的方法,才知道java8中接口可以有自己的实现了。那么jdk1.8究竟对接口做了哪些修改呢? 
(1) 增加default方法。default方法作用范围也是public,只是有了具体实现的方法体。对已有的接口,如果想对接口增加一个新方法,那么需要对所有实现该接口的类进行修改。而有了default方法,可以解决该问题。 
(2) 新增static方法。static修饰的方法也是非抽象方法,使用同类的静态方法一样,给方法的调用带来了方便。程序入口main方法也是static,现在接口也可以运行了。 
例如下面在InterfaceA中定义了一个default方法,一个static方法:

 public interface InterfaceA {
default String f(){
return"this is InterfaceA";
}
static String getName(){
return "InterfaceA";
}
}

那么在实现类中可以直接调用接口的default方法,通过接口名.方法名调用static方法

public class ImplClass implements InterfaceA {
public static void main(String[] args) {
System.out.println(new ImplClass().f());
System.out.println(InterfaceA.getName());
}
}

结果: 
 
但是注意,如果一个类同时实现了两个拥有相同方法签名(相同的方法名、参数)、返回类型的default方法后,需要在类中重写default方法,否则编译器会因为不知道应该调用哪一个接口中的default方法而报错 
再定义一个InterfaceB接口,和InterfaceA接口拥有相同方法签名、返回类型的f()

public interface InterfaceB {
default String f(){
return "this is InterfaceB";
}
}

ImplClass同时实现InterfaceA和InterfaceB,这时编译器会报错: 
 
重写接口中default方法后,编译器会执行重写后的方法:

 public class ImplClass implements InterfaceA,InterfaceB {
@Override
public String f(){
return "this is ImplClass";
}
public static void main(String[] args) {
System.out.println(new ImplClass().f());
}
}

结果: 
 
如果一个类同时继承的父类和实现的接口拥有相同签名、返回类型时,当该类未重写方法,直接调用时,将会调用父类中的方法: 
再定义一个父类FatherC,拥有和InterfaceA同签名、返回类型的方法f()

 public class FatherC {
public String f(){
return "this is FatherC";
}
}

ImplClass实现InterfaceA的同时继承FatherC,未重写方法f(),直接调用时,将会调用父类中的方法:

 public class ImplClass extends FatherC implements InterfaceA {
public static void main(String[] args) {
System.out.println(new ImplClass().f());
}
}

结果: 
 
接口已经越来越向类靠近了,所以现在接口和抽象类的区别有: 
1. 虽然接口和抽象类都不能被实例化,但是抽象类可以有构造器,接口没有构造器 
2. 抽象类单继承(只能继承一个类),接口多继承(能继承多个接口) 
3. 抽象类中方法可以有public、protected、默认(包)甚至private范围的方法,接口只能有public范围的方法(即使是default也是public范围的)

java8中接口default、static新特性,与抽象类区别的更多相关文章

  1. JAVA8中接口的一些新用法(springboot环境)

    @Configuration public interface IAbstractConvertStrategy { CacheService getCacheService(); default b ...

  2. Java 9中的 9个 新特性

    Java 9 中的 9个 新特性 java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它 ...

  3. 【译】.NET 5. 0 中 Windows Form 的新特性

    自从 Windows Form 在 2018 年底开源并移植到 .NET Core 以来,团队和我们的外部贡献者都在忙于修复旧的漏洞和添加新功能.在这篇文章中,我们将讨论 .NET 5.0 中 Win ...

  4. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  5. ABAP 7.52 中的Open SQL新特性

    S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52. 本文翻译了更新文档中有关Open SQL的部分 本文链接:http://www.cnblogs.com/hhelibe ...

  6. ABAP 7.40, SP08 中的 Open SQL 新特性

    1,使用 data_source~*指定列 在7.40, SP08中,可以在SELECT语句中使用data_source~*来指定选取不同的数据库表.视图的全部列来作为结果集.它也可以和单独指定的列c ...

  7. 聊聊 Java8 以后各个版本的新特性

    作者:ZY5A59 juejin.im/post/5d5950806fb9a06b0a277412 某天在网上闲逛,突然看到有篇介绍 Java 11 新特性的文章,顿时心里一惊,毕竟我对于 Java ...

  8. 一文带你认识Java8中接口的默认方法

    Java8是Oracle于2014年3月发布的一个重要版本,其API在现存的接口上引入了非常多的新方法. 例如,Java8的List接口新增了sort方法.在Java8之前,则每个实现了List接口的 ...

  9. Java8中的default方法

    default方法 Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods). Default方 ...

随机推荐

  1. 【深度聚类】Superpixel Sampling Networks

    Superpixel Sampling Networks 原始文档:https://www.yuque.com/lart/papers/ssn 本文的思想很简单,传统的超像素算法是一种有效的低/中级的 ...

  2. JS 截取字符的方法

    substr() 方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的 ...

  3. 使用注解@CrossOrigin解决跨域问题

    转一个大兄弟写的贴子,总结得很好,很全面 https://www.cnblogs.com/mmzs/p/9167743.html 作者: 淼淼之森

  4. Spring(七)--Spring JDBC

    Spring JDBC 1.需要的实体类和数据库 2.需要的dao层 package com.xdf.dao; import com.xdf.bean.Student; import org.spri ...

  5. 洛谷P1600 天天爱跑步——题解

    题目传送 首先要考虑入手点.先考虑一个一个玩家处理,显然不加优化的话,时间复杂度是O(n)的.发现对于玩家路径上的点都有一个观察员,一个都不能忽视,看起来是很难优化了.在做题时,发现一个思路很难想,就 ...

  6. POJ - 1287 Networking (最小生成树&并查集

    You are assigned to design network connections between certain points in a wide area. You are given ...

  7. java延时队列

    应用场景 1)7天自动收货 a.用户支付完成以后,把订单ID插入到内存的一个DelayQueue中,同时插入到Redis中. b.7天之内,用户点击了确认收货,则从DelayQueue中删除,从Red ...

  8. SQL的编写顺序和执行顺序,以及空值处理,别名处理,转义字符处理

    SQL即结构化查询语言.也就是用来从数据库中操作数据的.数据总的来说就是增删改查CRUD. 一,sql的分类,大致有四类: 1)DDL : 数据定义语言 create alter drop trunc ...

  9. 基于SOA的图书商城系统分析

    1.1什么是SOA架构? SOA( Service Oriented Architecture)是一种面向服务的分布式架构,将每个实现特定功能的工程拆分为服务层和表现层.服务层负责处理业务逻辑,对外提 ...

  10. YUV格式详解【转】

    转自:http://blog.csdn.net/searchsun/article/details/2443867 [-] YUV格式解析1播放器project2 YUV 采样 表面定义 YUV格式解 ...