在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. Yandex.Algorithm 2011 A. Double Cola

    1.题目描写叙述:点击打开链接 2.解题思路:本题是一道找规律的数学题,通过题意描写叙述不难知道,相当于有5棵二叉树构成了一个森林,须要你按层次遍历找到第n个人是谁. 观察后不难发现,如果最開始的一层 ...

  2. secureCrt 开启Linux上的oracle服务

    IP   :  192.168.0.21 user:  root pwd:     123456 --------------------------------------------------- ...

  3. Android Studio 使用笔记:文件查询方法总结

    搜索单词 Windows: Ctrl + F Mac   : Cmd + F 会在当前激活的文件上查询输入的关键字,以高亮显示 跳转行 Windows: Ctrl + L Mac   : Cmd + ...

  4. CentOS6.4下编译安装Apache2.4+PHP5.6

    安装Apache2.4: 首先从  http://httpd.apache.org/download.cgi#apache24下载apache源码包httpd-2.4.4.tar.gz从  http: ...

  5. ASP.NET动态网站制作(23)-- ADO.NET(2)

    前言:这节课老师请高级班的E老师过来代课,还是接着老师讲的内容继续深入,修改了上节课老师写的部分代码. 内容: 1.数据库本质就是一个软件,这个软件帮助我们把数据有序地存储起来,当我们需要数据的时候帮 ...

  6. 解决Command "laravoole" is not defined.

    版权声明:本文为博主原创文章,未经博主允许不得转载.  GitHub地址:https://github.com/garveen/laravoole 先来执行正常的安装流程: 安装 要开始,将larav ...

  7. 9.接口BeanPostProcessor

    package org.springframework.beans.factory.config; import org.springframework.beans.BeansException; p ...

  8. 像使用linux一样使用mac

    1 不能像使用windows一样使用mac 因为mac卸载不方便. 2 gcc的问题 就使用系统默认的gcc,即clang,要想使用原声的gcc是不行的,mac本身不支持.

  9. [Android]豆瓣FM离线数据

    离线目录结构: /sdcard/Android/data/com.douban.radio下 ./cache/fileCaches: 离线音乐歌词(lyric) ./cache/images: 离线音 ...

  10. linux c编程:线程退出

    在线程创建的时候pthread_exit都是调用的固定参数,我们先来看下如果用自动变量作为pthread_exit的参数时出现的问题 typedef struct foo{ int a; int b; ...