在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。

  1. public interface JDK8BeforeInterface {
  2. public static final int field1 = 0;
  3. int field2 = 0;
  4. public abstract void method1(int a) throws Exception;
  5. void method2(int a) throws Exception;
  6. }

JDK8及以后,允许我们在接口中定义static方法和default方法。

  1. public interface JDK8Interface {
  2. // static修饰符定义静态方法
  3. static void staticMethod() {
  4. System.out.println("接口中的静态方法");
  5. }
  6. // default修饰符定义默认方法
  7. default void defaultMethod() {
  8. System.out.println("接口中的默认方法");
  9. }
  10. }

再定义一个接口的实现类:

  1. public class JDK8InterfaceImpl implements JDK8Interface {
  2. //实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
  3. }

静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。

  1. public class Main {
  2. public static void main(String[] args) {
  3. // static方法必须通过接口类调用
  4. JDK8Interface.staticMethod();
  5. //default方法必须通过实现类的对象调用
  6. new JDK8InterfaceImpl().defaultMethod();
  7. }
  8. }

当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。

  1. public class AnotherJDK8InterfaceImpl implements JDK8Interface {
  2. // 签名跟接口default方法一致,但是不能再加default修饰符
  3. @Override
  4. public void defaultMethod() {
  5. System.out.println("接口实现类覆盖了接口中的default");
  6. }
  7. }

由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。

  1. public interface JDK8Interface1 {
  2. // static修饰符定义静态方法
  3. static void staticMethod() {
  4. System.out.println("JDK8Interface1接口中的静态方法");
  5. }
  6. // default修饰符定义默认方法
  7. default void defaultMethod() {
  8. System.out.println("JDK8Interface1接口中的默认方法");
  9. }
  10. }
  1. public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
  2. // 由于JDK8Interface和JDK8Interface1中default方法一样,所以这里必须覆盖
  3. @Override
  4. public void defaultMethod() {
  5. System.out.println("接口实现类覆盖了接口中的default");
  6. }
  7. }
  1. public class Main {
  2. public static void main(String[] args) {
  3. JDK8Interface.staticMethod();
  4. JDK8Interface1.staticMethod();
  5. new JDK8InterfaceImpl().defaultMethod();
  6. }
  7. }

JDK8新特性:接口的静态方法和默认方法的更多相关文章

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

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

  2. Java8系列 (四) 静态方法和默认方法

    静态方法和默认方法 我们可以在 Comparator 接口的源码中, 看到大量类似下面这样的方法声明 //default关键字修饰的默认方法 default Comparator<T> t ...

  3. Java8系列 (四) 静态方法和默认方法(转载)

    静态方法和默认方法 我们可以在 Comparator 接口的源码中, 看到大量类似下面这样的方法声明 //default关键字修饰的默认方法 default Comparator<T> t ...

  4. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

  5. JDK8新特性面试

    java8:http://ifeve.com/java-8-features-tutorial/ 一.Lambda表达式和函数式接口 Lambda表达式(也叫做闭包) 它允许我们将一个函数当作方法的参 ...

  6. JDK8新特性之接口默认方法与静态方法

    接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...

  7. JDK8新特性之接口

    在JDK7及以前的版本中,接口中都是抽象方法,不能定义方法体,但是从jdk8开始,接口中可以定义静态的非抽象的方法,直接使用接口名调用静态方法,但是它的实现类的类名或者实例却不可以调用接口中的静态方法 ...

  8. JDK8新特性:函数式接口@FunctionalInterface的使用说明

    我们常用的一些接口Callable.Runnable.Comparator等在JDK8中都添加了@FunctionalInterface注解. 通过JDK8源码javadoc,可以知道这个注解有以下特 ...

  9. JDK8新特性:函数式接口

    一,定义 函数式接口,英文为Functional Interface.首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法. 这里的只允许一个抽象方法不包括以下几 ...

随机推荐

  1. Qemu事件处理机制简介

    Qmeu 采用了基于事件驱动的架构,所有的事件都在一个事件循环(event loop)中被处理,系统中默认的事件循环是在main-loop.c 中的主循环(main loop).我们也可以使用 –ob ...

  2. linux 登陆key生成

    1.登录A机器 2.ssh-keygen -t rsa,将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub Generating public/priv ...

  3. oracle中的minus数据比对

    1.要有唯一索引或者主键作为前提,减少数据冲突的数量,如示例标红的地方:   2.当有in查询的时候,尽量用exists,这样能提高查询效率: create table TF_F_USER_DIFF1 ...

  4. /var/log目录下的Linux日志文件功能详解_转

    摘自:http://www.niaoyun.com/help/application/386.html 学习linux应该知道日志文件的所在位置以及它们包含的内容,在系统运行正常的情况下学习了解这些不 ...

  5. 在Ubuntu下编译FFmpeg

    第一步:准备编译环境 .tar.bz2 -2245/ ./configure --enable-static--enable-shared--prefix=/usr/localmakesudomake ...

  6. android.util.AndroidRuntimeException Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? com.uethinking.microvideo.manag

    记录学习,网络摘抄 碰到这个异常其实这个上面说的很清楚,加个flag 从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK ...

  7. 更改Mysql 密码的4种方法(转)

    原文:http://www.jb51.net/article/39454.htm 方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password f ...

  8. 【转】Jenkins+Ant+Jmeter接口自动化集成测试实例

    出处:https://my.oschina.net/MrToStudy/blog/742251 一.Jenkins安装配置 1.安装配置JDK1.6+环境变量: 2.下载jenkins.war,放入C ...

  9. 在Linux下搭建Git服务器步骤

    环境: 服务器 CentOS6.6 + git(version 1.7.1) 客户端 Windows10 + git(version 2.8.4.windows.1)  ① 安装 Git Linux ...

  10. Hadoop 101: Programming MapReduce with Native Libraries, Hive, Pig, and Cascading

    和Hadoop交互的四种方法: 1. Native Libraries 2. Hive 3. Pig 4. Cascading At a high level, people use the nati ...