天天看點

Java基礎之六、Java程式設計思想(8-10)

八、多态

多态(也稱作動态綁定、後期綁定或運作時綁定)

  • 域(成員變量)是不具有多态性的,隻有普通的方法調用是多态的,任何域通路操作都将由編譯器解析,是以不是多态的
  • 靜态方法也是不具有多态性的

  public static void main(String[] args){

    Super sup = new Sub(); // Upcast

    System.out.println("sup.field = " + sup.field + ". sup.getField() = " + sup.getField());//sup.field傳回父類的成員值,雖然子類也定義了同名成員,sup.getField()通路子類的重寫方法

  }

九、接口

1:在class前添加abstract關鍵字,定義成抽象類。

  • 抽象類不能執行個體化,即不能通過new生成對象,但注意可以追加{}生成匿名實作類,仍然不是它自己的執行個體化。
  • 抽象類可以有構造函數,但不能直接調用,通常由實作類構造函數調用。
  • 抽象類的方法前添加abstract關鍵字,定義抽象方法,派生類必須重寫該方法,然後才能執行個體化。Java類中如有抽象方法,則類符号前必須也要添加abstract關鍵字,定義為抽象類(可以沒有抽象方法)。
  • 抽象類中可以沒有抽象方法,即可以全部是含方法體的非抽象方法(可以包含已實作的成員方法)。

  通過匿名類實作抽象類和接口的例子

  

Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)

2:接口,抽象類進一步抽象,即所有方法都沒有具體實作,隻聲明了方法的形式,并且把

class

關鍵字改成

interface

關鍵字

  • 接口可以包含域,且隐式地是static 和 final的,顯然,接口中的域不能是空final,這些域不是接口的一部分,它們存儲在該 接口的靜态存儲區域内。
  • 接口關鍵字interface前可以添加public修飾符,不加預設是包通路權限,接口的方法預設都是public的。
  • 因為Java接口沒有任何具體實作,即沒有任何與接口相關的存儲,是以可以定義一個Java類來implements多個接口,達到C++中多重繼承的效果。
  • Java可以定義一個接口去extends另外的一個或多個接口來實作接口的擴充。
  • 因為Java接口中的域自動是final和static的,是以接口就成了一種便捷的建立常量組的工具。在Java SE5之前,用這種方式來産生enum的效果。Java SE5之後,Java有了enum關鍵字,是以使用接口來群組常量就沒意義了

 十、内部類(參考原文連結:https://blog.csdn.net/u013728021/article/details/87358517)

  當某個類建立一個内部類對象時,此内部類對象必定會秘密地捕獲一個指向那個外圍類的對象的引用

  • 可以無條件地通路外圍類的所有元素實作隐藏
  • 可以實作多重繼承
  • 通過匿名内部類來優化簡單的接口實作
  • 内部類方法可以通路該類定義所在作用域中的資料,包括被 private 修飾的私有資料
  • 内部類可以對同一包中的其他類隐藏起來
  • 内部類可以解決 java 單繼承的缺陷
  • 當我們想要定義一個回調函數卻不想寫大量代碼的時候我們可以選擇使用匿名内部類來實作

  内部類雖然和外部類寫在同一個檔案中, 但是編譯完成後, 還是生成各自的class檔案,内部類通過this通路外部類的成員  

  • 1 編譯器自動為内部類添加一個成員變量, 這個成員變量的類型和外部類的類型相同, 這個成員變量就是指向外部類對象(this)的引用;
  • 2 編譯器自動為内部類的構造方法添加一個參數, 參數的類型是外部類的類型, 在構造方法内部使用這個參數為内部類中添加的成員變量指派;
  • 3 在調用内部類的構造函數初始化内部類對象時,會預設傳入外部類的引用。

  1、内部類通路外包類的資料 

Java基礎之六、Java程式設計思想(8-10)

   代碼輸出“外部類資料”//data這是在DataOuterClass定義的私有變量。這個變量在内部類中可以無條件地通路.

  2、實作隐藏

  内部類則可以使用 private 和 protected 來修飾,内部類實作某個接口的時候,在進行向上轉型,對外部來說,就完全隐藏了接口的實作了

Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)

  從這段代碼裡面我隻知道OuterClass的getInner()方法能傳回一個InnerInterface接口執行個體但我并不知道這個執行個體是這麼實作的。

  而且由于InnerClass是private的,是以我們如果不看代碼的話根本看不到這個具體類的名字,是以說它可以很好的實作隐藏。

  3、可以實作多重繼承

   java 是不允許使用 extends 去繼承多個類的。内部類的引入可以很好的解決這個事情

Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)
Java基礎之六、Java程式設計思想(8-10)

  4、普通内部類建立方法,對于非靜态内部類,内部類的建立依賴外部類的執行個體對象  

Java基礎之六、Java程式設計思想(8-10)

  5、内部類的分類

  6、

.this

 與 

.new

  7、閉包與回調  

  • 閉包(closure)是一個可調用的對象,它記錄了一些資訊,這些資訊來自于建立它的作用域。通過這個定義可以看出内部類是面向對象的閉包,因為它不僅包含外圍類對象(建立内部類的作用域)的資訊,還自動擁有一個指向此外圍類對象的引用(.this),在此作用域内,内部類有權操作所有的成員,包括private成員。
  • 回調(callback),通過回調,對象能夠攜帶一些資訊,這些資訊允許它在稍後的某個時刻調用初始的對象。Java中沒有指針,通過内部類提供的閉包功能可以實作回調。

  java閉包主要是通過接口+内部類來實作,有兩種形式:接口+内部類和接口+局部内部類

出處:轉載請注明 https://www.cnblogs.com/sun-null/