java8接口中的默認方法


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.最后,如果還是無法判斷,繼承了多個接口的類必須通過顯示覆蓋和調用期望的方法,顯示地選擇使用哪一個默認方法的實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM