1. 程式人生 > >Java基礎——介面

Java基礎——介面

介面

  1. 介面是一種抽象型別,關鍵字interface,是抽象方法的集合。
  2. 介面不能例項化,可以被實現。
  3. 介面中的方法都是抽象方法(預設public abstract ),沒有構造方法。沒有成員變數,預設都是靜態常量(預設public static final)。
  4. 一個類通過關鍵字implements實現介面,介面中定義的所有抽象方法必須實現。但是,抽象類就不強制要求必須實現介面的抽象方法。
  5. 介面可以繼承介面,而且不同於類的是可以多繼承,格式:A extends B,C…

示例程式碼體會: 程式碼通過標記介面分類,並通過不同的繼承和實現效果,按照優先順序展示結果。 介面示例體會

@1. 主要定義了6個介面,其中包含標記介面、介面多繼承、定義抽象方法、定義靜態常量效果。 @1.1 Animal.java、Humans.java、Others.java可以作為頂層標記介面,分別標記了動物、人類、未知三個種類。

什麼是標記介面?我們在程式設計時可以通過定義沒有方法和變數的空介面,作為一個抽象型別標記,為繼承它的介面或實現它的類標記一個型別,思考下這有什麼意義呢?

/**
 * @Description : 標記介面(沒有定義函式或變數)
 */
public interface Animal {
}
public interface Humans {
}

public interface Others {
}

@1.2 Beneficial.java、Pests.java作為二級介面,繼承了Animail.java介面(意味著它們被標記為Animail),並分別定義了各自的抽象方法和靜態常量。

為什麼介面中的方法必須是公開抽象的?變數必須是公開靜態常量? public當然是為了它的實現類能夠呼叫。 抽象方法是介面的特性,介面只能定義抽象方法,不能具體實現,只能由實現類來完成。 static final,因為介面不能例項化,所以必須靜態載入,而final自然是為了保證值不變。

/**
 * @Description : 介面可以繼承介面,定義抽象方法和靜態常量。
 */
public interface Beneficial extends Animal {

    public static final String BENE_PRO_VALUE = "useful";

    public abstract String getBeneProValue();

}
/**
 * @Description : 介面可以繼承介面,定義抽象方法和靜態常量。
 */
public interface Pests extends Animal {

    public static final String PESTS_PRO_VALUE = "harm";

    public abstract String getPestsProValue();

}

@1.3 Godzilla.java展示了多繼承效果。GodzillaImpl.java是實現類,可以發現實現類必須實現自身及父介面的所有抽象方法。

/**
 * @Description : 介面可以繼承一個或多個介面。
 */
public interface Godzilla extends Beneficial,Pests {
}
/**
 * @Description : 一個類實現介面時,如果介面繼承了其它一個或多個介面時,應實現所有介面的抽象方法。
 */
public class GodzillaImpl implements Godzilla {

    private static final String GODZILLAIMPL_VALUE = "godzilla";

    @Override
    public String getBeneProValue() {
        return BENE_PRO_VALUE;
    }

    @Override
    public String getPestsProValue() {
        return PESTS_PRO_VALUE;
    }

    private String getGodzillaimplValue(){
        return GODZILLAIMPL_VALUE+"&"+BENE_PRO_VALUE+"&"+PESTS_PRO_VALUE;
    }
}

@2. 實現類 @2.1 Droy.java 實現了Humans.java介面。

/**
 * @Description :
 */
public class Droy implements Humans {

    private static final String DROY_NAME = "Droy Zhou";

    private String getDroyName(){
        return DROY_NAME;
    }
}

@2.2 Et.java實現了Others.java介面。

/**
 * @Description :
 */
public class Et implements Others {

    private static final String ET_VALUE = "et";

    private String getEtValue(){
        return ET_VALUE;
    }
}

@2.3 Frog.java 實現了Beneficial.java介面。

/**
 * @Description :
 */
public class Frog implements Beneficial {

    private static final String FROG_VALUE = "frog";

    @Override
    public String getBeneProValue() {
        return BENE_PRO_VALUE;
    }

    private String getFrogValue(){
        return FROG_VALUE+"&"+BENE_PRO_VALUE;
    }
}

@2.4 Locust.java 實現了Pests.java介面。

/**
 * @Description :
 */
public class Locust implements Pests {

    private static final String LOCUST_VALUE = "locust";

    @Override
    public String getPestsProValue() {
        return PESTS_PRO_VALUE;
    }

    private String getLocustValue(){
        return LOCUST_VALUE+PESTS_PRO_VALUE;
    }
}

@2.5 Sparrow.java直接實現了標記介面Animal.java。

/**
 * @Description :
 */
public class Sparrow implements Animal {

    private static final String SPARROW_VALUE = "sparrow";

    private String getSparrowValue(){
        return SPARROW_VALUE;
    }
}

@2.6 Monster.java實現了多個介面效果,這樣它必須實現所有介面的抽象方法。

/**
 * @Description : 一個類可以同時實現多個介面,而且必須實現每一個介面的抽象方法。
 */
public class Monster implements Animal,Beneficial,Pests,Humans,Others {

    private static final String MONSTER_VALUE = "monster";

    @Override
    public String getBeneProValue() {
        return BENE_PRO_VALUE;
    }

    @Override
    public String getPestsProValue() {
        return PESTS_PRO_VALUE;
    }

    private String getMonsterValue(){
        return MONSTER_VALUE+"&"+BENE_PRO_VALUE+"&"+PESTS_PRO_VALUE;
    }
}

@3. 最後通過main體會介面的用法及效果。

/**
 * @Description :
 */
public class InterFacesMain {
    public static void main(String[] args) {
        Object[] objects = new Object[]{new Droy(), new Frog(), new Locust(), new Sparrow(), new Et(), new GodzillaImpl()};
        System.out.println("開始分析樣本:");
        for (int i = 0; i < objects.length; i++) {
            if (objects[i] instanceof Animal) {
                if (objects[i] instanceof Godzilla) {
                    System.out.println(i + 1 + "    這是哥斯拉!");
                } else if (objects[i] instanceof Beneficial) {
                    System.out.println(i + 1 + "    這是一隻益蟲!");
                } else if (objects[i] instanceof Pests) {
                    System.out.println(i + 1 + "    這是一隻害蟲!");
                } else {
                    System.out.println(i + 1 + "    這是一隻不好不壞的動物!");
                }
            } else if (objects[i] instanceof Humans) {
                System.out.println(i + 1 + "    這是一個人類!");
            } else {
                System.out.println(i + 1 + "    這是一種未知物!");
            }
        }
    }
}

輸入出結果:

開始分析樣本:
1    這是一個人類!
2    這是一隻益蟲!
3    這是一隻害蟲!
4    這是一隻不好不壞的動物!
5    這是一種未知物!
6    這是哥斯拉!

可以更改程式碼體驗更多效果幫助我們直觀的理解介面效果,體會它的意義。 點選下載>>>示例原始碼