美文网首页java进阶干货
java8接口中的默认方法

java8接口中的默认方法

作者: 罗志贇 | 来源:发表于2017-12-12 10:42 被阅读0次

java8接口中的默认方法

概述默认方法

java8中可以在接口中定义一个default修饰的方法,例如:

public interface Sized{
    int size();
    default boolean isEmpty(){
        return size() == 0;
    }
}

这样任何一个实现了Sized接口的类都会自动继承isEmpty的实现

java 8中的抽象类和抽象接口
一个类智能继承一个抽象类,但是一个类可以实现多个接口
一个抽象类可以通过实例变量保存一个通用状态,而接口是不能有实例变量的

默认方法的使用模式

可选方法

很有可能有一种情况就是,类实现了接口,不过却刻意地将一些方法的实现留白.例如Iterator接口定义了hasNext.next,还定义了remove方法.java8之前,由于用户通常不会使用该方法,remove方法常被忽略.因此,实现Interator接口的类通常会为remove方法方之一个空的实现

在java8中,Iterator接口就为remove方法提供了一个默认实现,如下所示:

interface Iterator<T>{
    boolean hasNext();
    T next();
    default void remove(){
        throw new UnsupportedOerationException();
    }
}
行为的多继承

这是一种让类从多个来源重用代码的能力

interface Rotatable{
    void setRotationAngel(int angleInDegrees);

    int getRotationAngle();

    default void rotateBy(int angleInDegrees) {
        setRotationAngel((getRotationAngle() + angleInDegrees) % 360);
    }
}

interface Resizable {
    int getWidth();

    int getHeight();

    void setWidth(int width);

    void setHeight(int height);

    void setAbsoluteSize(int width, int height);

    default void setRelativeSize(int wFactor, int hFactor) {
        setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor);
    }
}


interface Moveable {
    int getX();

    int getY();

    void setX(int x);

    void setY(int y);

    default void moveHorizontally(int distance) {
        setX(getX() + distance);
    }

    default void moveVertically(int distance) {
        setY(getY() + distance);
    }
}

class Monster implements Rotatable, Moveable, Resizable {
    .....
}

 public static void main(String[] args) {
        //现在可以直接调用不同的方法:
        Monster m = new Monster();
        m.rotateBy(180);
        m.moveHorizontally(10);

 }

解决冲突的原则

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

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

class C  implements B, A {
    public static void main(String[] args) {
        new C().hello();//打印B
    }
}

三条原则:

1.类中的方法优先级最高

2.如果无法一句第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体

3.最后,如果还是无法判断,继承了多个接口的类必须通过显示覆盖和调用期望的方法,显示地选择使用哪一个默认方法的实现

相关文章

  • java8接口中的默认方法

    java8接口中的默认方法 概述默认方法 java8中可以在接口中定义一个default修饰的方法,例如: 这样任...

  • 接口(interface)和抽象类(abstract class

    1、接口中的方法默认都是 public,所有方法在接口中不能有默认实现(Java8 开始接口方法可以有默认实现),...

  • 接口(interface)和抽象类(abstract class

    接口中的方法默认都是 public,所有方法在接口中不能有默认实现(Java8 开始接口方法可以有默认实现),而抽...

  • 接口和抽象类的区别

    1、接口的方法默认是public,所有方法在接口中不能有实现(Java8开始接口方法可以有默认实现),抽象类可以有...

  • Java新特性之Java8的那些事儿-接口默认方法

    什么是接口默认方法 ​ 从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类...

  • Java中的Lambda表达式

    Java8中新增了一个默认的方法。 这个默认方法的目的是在接口中可以实现方法,而且不强制要求实现类去实现这个方法,...

  • Koltin之类的定义

    类的定义 接口 interface 类似 Java8 接口中的方法可以有默认实现,但是不需要 default 关键...

  • Java8新特性

    1.接口的默认方法和静态方法 在Java8之前,接口中只能包含抽象方法。那么这有什么样弊端呢?比如,想再Colle...

  • Java8-接口中的默认方法与静态方法

    在Java8以前,我们知道接口中是不能够有方法的具体实现的,但是Java8中则允许有接口的默认实现。 我们先来个例...

  • java8特性简单介绍

    接口默认方法支持 通过使用default关键字,java8可以在接口中增加非抽象的方法实现,这个功能也被称之为扩展...

网友评论

    本文标题:java8接口中的默认方法

    本文链接:https://www.haomeiwen.com/subject/zwpgixtx.html