【從基礎學 Java】接口與內部類

接口

繼承那篇博文裏,咱們已經簡單瞭解了 Java 接口的概念。即:接口是用來描述對象具備的某種「功能」,而不關心具體實現。或者說,接口比如服務商指定的標準,由代加工工廠遵照來生產。java

這裏是一個 Java 裏的接口示例:segmentfault

public interface Comprable<T>{
    int compareTo(T other);
}

Java 8 中,接口裏能夠包含:設計模式

  • default 方法
  • 靜態方法
  • 方法簽名
  • 常量定義

在Java 裏,定義了一些標記接口(tagging interface),實現了這些接口的類,語義上應具備接口的特性。如:ide

  • 實現(implements)Comparable接口的類,咱們默認其具備可比較的特性;
  • 實現Clonable接口的類,咱們默認其具備可克隆的特性(Object 類默認實現該接口,具備淺拷貝的能力);
  • 實現Serializable接口的類,咱們默認其具備可序列化的特性。

Java 的接口還有一個比較重要的應用,那就是回調設計

回調是一種比較常見的設計模式,其本質是在發生某種事件時應採起的某種行爲。code

內部類

Java 容許在類中定義其它類,這種定義在類中的類叫作嵌套類(nested class)。其中,對象

  • 靜態的嵌套類叫作靜態嵌套類
  • 非靜態的嵌套類叫作內部類

嵌套類主要有以下兩種功能:繼承

  • 邏輯上劃分類的做用範圍
  • 加強封裝特性

主要有兩種特別的內部類:接口

  • 局部類:定義在代碼塊中的類
  • 匿名類:

局部類

局部類可訪問的成員範圍以下:事件

  • 局部類能夠訪問定義爲 final 或者本質上是 final (初始化以後不會被更改)的變量以及方法的參數。
  • 局部類不能定義或聲明靜態成員
  • 代碼塊中不能定義接口(接口本質上是靜態的)
  • 局部類中不容許有靜態初始化或者接口成員
  • 局部類中能夠定義常量值變量(能夠在編譯時期轉換的值)

匿名類

匿名類容許同時定義和初始化一個類,常被用做那些只使用一次的場景中。局部類是聲明,匿名類是表達式。
下面是一個匿名類的使用示例代碼:

interface SomeInterface{
    public void doSomething();
}

public void function(){
    SomeInterface someInterface = new SomethingInterface(){
        @Override
        public void doSomething(){
            // implement here...
        }
    }
}

匿名類中主要包含以下內容:

  • new 操做符
  • 須要實現的接口名稱
  • 相似於無參構造的形式
  • 一個實現類的體

匿名類能夠訪問的成員範圍是:

  • 匿名類能夠訪問外部類的成員
  • 匿名類能夠訪問外部類聲明爲 final 或者本質上是 final 的局部變量
  • 匿名類中定義定義的變量會屏蔽外部類的同名變量

Lambda 表達式

Lambda 表達式中包含的內容以下:

  • 用逗號分隔的形參列表(能夠忽略數據類型,若是隻有一個形參,那麼小括號也是能夠忽略的)
  • 箭頭 →
  • 方法體(若是方法體中只有一行代碼,那麼花括號也能夠省略)

Lambda 表達式中不存在變量的屏蔽問題。

若是 Lambda 表達式中引用已經存在的方法,那麼能夠用 類::方法名 來引用方法。
有四種類型的方法引用:

類型 引用方式
引用靜態方法 類名::方法名
引用特定對象的方法 對象名::方法名
引用特定類型的任意對象的示例方法 類型::方法名
引用構造方法 類名::new

嵌套類、Lambda 表達式的使用範圍

  • 局部類:當須要使用一個類的多個示例時。
  • 匿名類:當須要聲明字段或其它方法時。
  • Lambda 表達式:

    • 當須要把特定的代碼塊傳給其它方法做爲參數
    • 當須要使用一個接口的「實例」時
相關文章
相關標籤/搜索