interface中的默認方法(default)和靜態方法(static)


Java8 中接口新增了default和static方法,這兩種方法在接口中都可以有具體實現。
普通的抽象方法和default方法會被子類繼承,子類必現實現普通抽象方法,而default方法子類可以實現,也可以選擇不實現。
static方法不能被繼承,也不能被子類實現,只能被自身調用

1.定義一個接口

定義一個璃月角色攻擊模式的接口, 重擊和普通攻擊有固定倍率,而大招傷害因為每個角色不同,需要單獨結算。而滑翔技能因為沒有傷害,所以不需要繼承實現,於是使用了靜態方法

/**
 * 璃月地區角色攻擊方式及倍率接口
 */
public interface LiYue {

    /**
     * 元素爆發技能,每個角色的計算方式不同,需要具體實現
     * @param atk 攻擊力
     * @return 傷害
     */
    Integer elementalBurst(int atk);

    /**
     * 重擊,,默認倍率 100%
     * @param atk 攻擊力
     * @return 傷害
     */
    default Integer thump(int atk) {
        return new Double(Math.floor(atk * 2)).intValue();
    }

    /**
     * 普通攻擊,默認倍率 50%
     * @param atk 攻擊力
     * @return 傷害
     */
    default Integer attack(int atk) {
        return new Double(Math.floor(atk * 1.5)).intValue();
    }

    /**
     * 滑翔操作,沒有傷害
     */
    static void gliding(String name) {
        System.out.println(name + "滑翔");
    }
}

2.繼承接口的類

  • 1.第一個角色是刻晴,她的重擊和普通攻擊是固定倍率,只需要實現大招。
/**
 * 刻晴
 */
public class KeQing implements LiYue {

    /**
     * 元素爆發技能,倍率 1000%
     * @param atk 攻擊力
     * @return 傷害
     */
    @Override
    public Integer elementalBurst(int atk) {
        return atk * 10;
    }
}
  • 2.而胡桃作為版本之子,她的重擊和普通攻擊和其他人不一樣,所有技能都要實現
/**
 * 胡桃
 */
public class HuTao implements LiYue {
    @Override
    public Integer elementalBurst(int atk) {
        return atk * 20;
    }

    @Override
    public Integer thump(int atk) {
        return atk * 4;
    }

    @Override
    public Integer attack(int atk) {
        return atk * 2;
    }
}

3.測試

進行一次打Boss 測試

public class TestBoss {

    static int atk = 1700;

    static void keQingSub() {
        KeQing keQing = new KeQing();
        LiYue.gliding("刻晴");
        int damage = keQing.attack(atk) * 3 + keQing.thump(atk) + keQing.elementalBurst(atk);
        System.out.println("刻晴的傷害總值:" + damage);
    }

    static void huTaoSub() {
        HuTao huTao = new HuTao();
        LiYue.gliding("胡桃");
        int damage = huTao.attack(atk) * 3 + huTao.thump(atk) + huTao.elementalBurst(atk);
        System.out.println("刻晴的傷害總值:" + damage);
    }

    public static void main(String[] args) {
        keQingSub();
        huTaoSub();
    }
}

輸出:

刻晴滑翔
刻晴的傷害總值:28050
胡桃滑翔
刻晴的傷害總值:51000

結論,胡桃的傷害比刻晴高!

4.總結

1. default方法子類可以實現,也可以選擇不實現。

2. static方法不能被繼承,也不能被子類實現,只能被自身調用


免責聲明!

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



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