Java之接口(一)

Java之接口(一)

距離上篇已通過了很久啦,主要是臨近期末,忙着複習,接口方面也看了好多天,查看了不少資料,層次不齊,最終查看了官方文檔對於interface的介紹,才逐漸清晰一些。可是,畢竟是英文,看起來仍是相對有些費勁的,可是看完一整篇下來,產生了一種英文進步飛快的錯覺哈哈哈哈。學習

話很少說,直接給一個形象生動的例子:spa

There are a number of situations in software engineering when it is important for disparate groups of programmers to agree to a "contract" that spells out how their software interacts. Each group should be able to write their code without any knowledge of how the other group's code is written. Generally speaking, interfaces are such contracts.code

大概的意思就是,開發的時候,每一個小組只需承認一份軟件交互的「契約」,不須要關注其餘小組的代碼是怎麼寫的。咱們將要學習的接口,就是充當這個「契約」的角色。其實也挺好理解的,面向對象的口號不就是高內聚低耦合嘛,接口的出現很好地讓規範和實現分離,從而大大下降了各組件的耦合,大大提升了可擴展性和可維護性。
再接着說,接口是一種規範,是其餘組成部分都必須遵照的,是一組公共的方法,和咱們以前談到的抽象類真的很像,它們達到的功能其實也差很少,二者差異咱們以後會詳細分析。接下來應該會分許多個部分探究接口,敬請期待。對象

接口中的定義格式

package com.my.pac19;
//Output.java
/**
 * @auther Summerday
 */
public interface Output {
    //常量: public static final int MAX_CACHE_LINE=50;
    int MAX_CACHE_LINE = 50;
    //普通方法: public abstract void out();
    void out();

    void getData(String msg);
    //默認方法: public default void print(String...msgs)
    default void print(String...msgs){
        for(String msg:msgs){
            System.out.println(msg);
        }
    }

    default void test(){
        System.out.println("default test()");
    }
    
    
    //靜態方法:public static String staticTest()
    static String staticTest(){
        return "the static method in interface";
    }

    //!false:static String staticTest1();
}

使用interface關鍵字表示接口,能夠把接口看做是特殊的類,命名規範相似。並且,一個Java源文件中最多隻能有一個public接口,且Java源文件名應該和public接口名相同。繼承

[修飾符] interface [接口名] extends [父接口1],[父接口2] {
    //零到多個常量定義
    //零到多個抽象方法定義
    //零到多個默認方法和類方法定義
    //零到多個內部類、接口、枚舉定義
}
  • [修飾符]能夠是public,也能夠是缺省,缺省就默認採用包權限。
  • 接口能夠繼承多個接口,以逗號分隔,不能繼承類。
  • Java8以前並不容許默認方法和類方法的定義,增強以後就容許了。接口

  • 接口裏不能有構造器(不能建立對象)和初始化塊。
  • 接口中的成員(靜態變量、方法等)默認都是public修飾的,因此加不加public沒啥區別,但也只有這兩種選擇,由於畢竟規範就是須要讓別人知道並遵循的。開發

接口中的成員變量

接口中只能有靜態變量,不能有實例變量,由於它不能建立對象,也就不能有實例。文檔

//常量: public static final int MAX_CACHE_LINE=50;
    int MAX_CACHE_LINE = 50;
  • 接口中的域默認且只能是以public static final修飾的靜態常量,因此這幾個修飾詞能夠省略,如上。
  • 既然沒有構造器和初始化塊,那麼定義靜態變量時就應該給他初始化賦值,否則會報錯哦。
  • 靜態常量,僅有一份,且不能修改。

接口中的普通方法

Java8以前,接口中只容許聲明抽象方法,Java8以後作了加強,增長了對默認方法和類方法聲明的容許。這裏,暫且除那倆以外的稱做普通方法,也就是抽象方法get

//普通方法: public abstract void out();
    void out();

    void getData(String msg);
  • 相似的,接口中的普通方法既然是抽象方法,固然默認有abstract關鍵字了,上面提到接口中的成員都是public修飾的,因此普通方法默認public abstract,一樣的,能夠省略不寫。
  • 很顯然,抽象方法不能有具體的方法體實現。

接口中的默認方法

做爲Java8以後增長的默認方法,所謂存在即合理,它的出現必定解決了一些棘手的問題,可是目前我對此理解還不夠透徹,在以後的學習中,慢慢理解,再作總結。咱們先了解它的定義格式:

//默認方法: public default void print(String...msgs)
    default void print(String...msgs){
        for(String msg:msgs){
            System.out.println(msg);
        }
    }
//!false:default void test1();
//extension method should have a body
  • 默認方法以default關鍵字修飾,而不是static
  • 默認方法在接口中必須有具體實現,不然會報錯。
  • 默認方法是能夠在實現類中被重寫的。

接口中的靜態方法

一樣的,他和默認方法都是新引進的寶貝,具體優勢仍是以後再作分析。先看一手定義:

//靜態方法:public static String staticTest()
    static String staticTest(){
        return "the static method in interface";
    }

    //!false:static String staticTest1();
  • 靜態方法以static關鍵字修飾,且不能被重寫。
  • 同樣的,接口中的靜態方法也須要有具體的方法實現,否則就錯啦。
  • 靜態方法只屬於接口,只能在接口中調用靜態方法,並不能在接口實現類中調用方法。就是說只能以接口.靜態方法的格式調用接口中的靜態方法。
相關文章
相關標籤/搜索