距離上篇已通過了很久啦,主要是臨近期末,忙着複習,接口方面也看了好多天,查看了不少資料,層次不齊,最終查看了官方文檔對於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] { //零到多個常量定義 //零到多個抽象方法定義 //零到多個默認方法和類方法定義 //零到多個內部類、接口、枚舉定義 }
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
關鍵字修飾,且不能被重寫。接口.靜態方法
的格式調用接口中的靜態方法。