JDK8之前,interface中可以定义常量和抽象方法,访问修饰符是public。

public interface A {
/** a1和a2写法是等价的 */
public static final int a1 = 0; int a2 = 0; /** methodA1和methodA2写法是等价的 */
public abstract void methodA1(); void methodA2();
}

JDK8起,允许我们在interface中使用static和default修饰方法(使用这两种修饰符中其一就不能使用abstract修饰符),从而方法具有方法体。

public interface A {
/** default访问修饰符修饰的方法 */
default void methodB1() {
System.out.println("this is default method");
} /** static修饰符修饰的方法 */
public static void methodB2() {
System.out.println("this is static method");
}
}

default修饰的方法,通过接口的实现类的对象调用;static修饰的方法,直接通过接口名调用。

public class Test implements A{
public static void main(String[] args) { /** 接口的default方法,通过接口的实现类的对象调用 */
Test test = new Test();
test.methodB1(); /** 接口的静态方法,通过接口名调用 */
A.methodB2();
}
}

由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?

  • 如果有两个接口中的static方法一模一样,并且实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。
  • 如果两个接口中定义了一模一样的default方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。
public interface A {
/** default访问修饰符修饰的方法 */
default void methodB1() {
System.out.println("this is default method -- InterfaceA");
} /** static修饰符修饰的方法 */
public static void methodB2() {
System.out.println("this is static method -- InterfaceA");
}
} public interface B{
/** default访问修饰符修饰的方法 */
default void methodB1() {
System.out.println("this is default method -- InterfaceB");
} /** static修饰符修饰的方法 */
public static void methodB2() {
System.out.println("this is static method -- InterfaceB");
}
} public class Test implements A,B{
/** 由于A和B中default方法一样,所以这里必须覆盖 */
@Override
public void methodB1() {
System.out.println("this is Overriding methods");
} public static void main(String[] args) { /** 接口的default方法,通过接口的实现类的对象调用 */
Test test = new Test();
test.methodB1(); /** A接口的静态方法,通过接口名调用 */
A.methodB2();
/** B接口的静态方法,通过接口名调用 */
B.methodB2();
}
}

运行结果:

  

参考:https://blog.csdn.net/aitangyong/article/details/54134385

JDK8新增接口的默认方法与静态方法的更多相关文章

  1. jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法

    一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. 在本文中我们将学习这些新特性,并用实际 ...

  2. java8-新特性--(接口的默认方法与静态方法)

    Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ ...

  3. java8新特性:接口的默认方法与静态方法

    接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...

  4. JDK8.0接口中的默认方法和静态方法

    我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...

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

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

  6. JAVA_接口_默认方法&静态方法

    1.小结(注意): 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰 2.接口中,没有构造方法,不能创建对象 3.接口中,没有静态代码块 ...

  7. Java8新特性之四:接口默认方法和静态方法

    在JDK1.8以前,接口(interface)没有提供任何具体的实现,在<JAVA编程思想>中是这样描述的:"interface这个关键字产生了一个完全抽象的类,它根本就没有提供 ...

  8. Java 8 接口中的默认方法与静态方法

    Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...

  9. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

随机推荐

  1. [转]:Delphi XE中泛型数组的使用范例

    Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses ...

  2. Fluent动网格【11】:弹簧光顺

    动网格除了前面讲了很多的关于运动指定之外,另一个重要主题则为网格的更新. 在部件运动之后,不可避免的会造成网格形状的变化,如若不对网格加以控制,在持续运动的过程中,则可能造成网格极度变形.歪曲率过大, ...

  3. 2018铁三测评题write以及一些想送给你们的话

    一..前言 此文献给实验室的萌新们,以及刚刚接触CTF的同学们,希望能对你们的成长起到一些帮助. 二.关于CTF 可能你已经接触过CTF或者对它有所了解,这里我再简单介绍一下. 1.什么是CTF? C ...

  4. python serial 模块使用

    python3 开始, python 加入了 serial 操作串口的模块 模块的引用 import serial 串口的申请 serial_com1 = serial.Serial("/d ...

  5. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  6. 框架源码系列三:手写Spring AOP(AOP分析、AOP概念学习、切面实现、织入实现)

    一.AOP分析 问题1:AOP是什么? Aspect Oriented Programming 面向切面编程,在不改变类的代码的情况下,对类方法进行功能增强. 问题2:我们需要做什么? 在我们的框架中 ...

  7. jq 日期区间处理

    <html lang="en"><head> <meta charset="UTF-8"> <title>Tit ...

  8. MySQL优化之——备份和恢复

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46766919 备份 逻辑备份方法 使用MYSQLDUMP命令备份 MYSQLDUM ...

  9. PXE:kickstart配置文件:全自动安装centos、redhat 系统的配置

    default menu.c32 #多网卡,其实centos7会自动处理,默认使用第一个网卡 label centos76 menu label ??? centos76 from ftp timeo ...

  10. 媳妇要转java开发,我该怎么办?

    我是一名5年的java开发者,媳妇是一个5年的软件实施工程师,我们结婚快一年了,这几天她突然对我说,她想转java开发,让我辅导她学习java,我该怎么弄,我心底是不愿意她转开发的,毕竟她年龄也不小了 ...