Java8接口的默认方法

什么是默认方法,为什么要有默认方法

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。

为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了使接口没有引入与现有的实现不兼容发展。

如以下所示,

public interface Animal {
    default void eat() {
        System.out.println("animal eat default method");
    }
}

声明了一个接口,里面只有一个默认方法。然后写一个具体的类实现这个接口,

public class Dog implements Animal {
    public void sayHi() {
        System.out.println("dog");
    }

    public static void main(String args[]) {
        Dog dog = new Dog();
        dog.eat();
    }
}

再具体的类里面不是必须重写默认方法,但必须要实现抽象方法。

默认方法的多重继承

如下所示代码,

/**
 * Created by xinxingegeya on 15/9/18.
 */
public interface A {

    void doSomething();

    default void hello() {
        System.out.println("hello world from interface A");
    }

    default void foo() {
        System.out.println("foo from interface A");
    }
}

interface B extends A {
    default void hello() {
        System.out.println("hello world from interface B");
        A.super.hello();
        this.foo();
        A.super.foo();
    }
}

class C implements B, A {

    @Override
    public void doSomething() {
        System.out.println("c object need do something");
    }

    public static void main(String args[]) {
        A obj = new C();
        obj.hello();//调用B的方法
        obj.doSomething();
    }
}

打印结果:

hello world from interface B

hello world from interface A

foo from interface A

foo from interface A

c object need do something

obj.hello()调用的是B接口中的默认方法。同时在B接口中的默认方法有调用了父接口中的默认方法。

我们再来看一个例子,思考一下在多重继承中,如果出现了同名的默认方法,如下所示,

/**
 * Created by xinxingegeya on 15/9/18.
 */
public interface D {
    default void hello() {
        System.out.println("hello world from D");
    }
}

interface E {
    default void hello() {
        System.out.println("hello world from E");
    }
}

class F implements D, E {

    @Override
    public void hello() {
        System.out.println("hello world F class");
        D.super.hello();
        E.super.hello();
    }

    public static void main(String args[]) {
        F f = new F();
        f.hello();
    }

}

我们需要制定调用哪个接口的默认方法如下,

 D.super.hello();
 E.super.hello();

======END======

时间: 2024-10-04 18:33:49

Java8接口的默认方法的相关文章

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

Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只能在本接口中调用或在实现类中实现 下面是使用实例: 1 public interface MyInter { 2 default void df(){ //声明一个接口的默认方法 3 4 System.out.println("i'am default f"); 5 sf(); //调用本

java8新特性-默认方法

作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万理论,编写不出实际的代码,等于扯淡.而且,随着技术的革新,很多东西都不再是一成不变的,还记得刚出校门那会儿,面试官会问接口与类的区别啥的,大多人会回答:接口里面的全是抽象方法.这个回答在现在看来,或许已经过时了,随着JDK1.8的推出,接口里面也是可以有方法实现的.所以,在这里总结一下JDK1.8的

java8 接口的default方法和静态方法

以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法.不同的是:默认方法可以通过实现接口的类实例化的对象来调用,而类方法就相对于工具方法了.需要注意的是,此处的静态方法只能被public修饰(或者省略不写),不能是private或者protected. 好处:在Java 8 之前,接口不能有静态方法,因此按照惯例,接口Type 的静态工厂方法被放一个名为ypes 的不可实例化的伴生类中.例如Java Collections Framework的集合接口有45 个工

接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法.这种能力是向后兼容的,以便旧接口可以使用Java 8的lambda表达式功能. 例如,List和Collection没有foreach方法 public interface vehicle { default void print(){ System.out.println("I am a vehicle!"); } } 静态默认方法 public interface ve

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

Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ System.out.println("default"); } static void staticMehod(){ System.out.println("static"); } }   public static void main(String[]args){

Java8接口中的默认方法

Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8开始支持lambda表达式,可以把函数当做参数传递,最明显的lambda表达式应用场景莫过于对collection的每一个元素应用lambda.如果想为Collection实现lambda表达式:list.forEach(…); // 这就是lambda代码 首先想到的是为Collection的父接

Java8 默认方法

概述 Java8新增了接口的默认方法.使用default关键字. 默认方法就是接口可以有实现方法,而且不需要实现类来实现其方法.相对于JDK1.8之前的接口来说,新增了可以接口中实现方法. 可以说在接口中实现方法一部分原因是为了lambda表达式服务的,因为lambda表达式只能交给接口. 分类 语法 多个默认方法 因为接口中有了默认方法,一个类又可以实现多个接口,难免会碰到相同名称的方法,当一个类实现多个接口,多个接口中存在同名的default方法,就需要子类重新实现,避免二义性 静态默认方法

Java中解决继承和接口默认方法冲突

1)超类优先.如果超类提供了一个具体方法,同名而且有相同参数类型发默认方法会被忽略. 2)接口冲突.如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突. 下面来看第二个规则.考虑另一个包含getName方法的接口: interface Named { default String getName(){ return getClass().getName() + "_" + hashCode():} } 如果

java8新特性四-默认方法

简介 Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个 default 关键字即可实现默认方法. 为什么要有这个特性? 首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法再给接口添加新方