接口
- 概念
- 比抽象類更抽象的類
- 只描述所應具備的方法,並沒有實現
- 將功能定義與實現實現分離,優化了程序設計
- 接口是功能的集合
- 接口的方法都是public abstract方法
- 接口的成員變量都是public final static變量
- 類 實現 接口,使用implements關鍵字
- 子類必須重寫父類接口所有的方法,否則只能抽象類
- 接口不能實例化
- 接口:多繼承 ,即接口可以繼承多個接口
- 接口子類:多實現,即子類可以實現多個接口
- 多個類可以實現同一個接口,一個類可以實現愛你多個接口
接口思想
- 接口的出現擴展了功能
- 接口其實是暴露出來的規則
- 接口的出現降低了耦合性,即設備與設備之間出現瞭解耦
接口與抽象類
相同點:
- 都位於繼承的頂端,用於被其他類實現或者繼承
- 不能實例化
- 包含抽象方法,子類必須重寫這些方法
區別:
- 抽象類可以包含非抽象方法,而接口只能有抽象方法
- 一個類只能繼承一個直接父類,但是可以實現多個接口
匿名對象
概念
- 在創建對象時,只有創建對象的語句,卻沒有把對象地址賦值給某個變量
特點
- 沒有變量名
- 只能使用一次
- 可以作爲方法接收的參數 方法返回值使用
內部類
概念
- 將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置
- 內部類可以自由訪問外部類的成員變量
- 如果內部類是靜態的,就不能訪問外部類的靜態變量
- 成員內部類
- 外部類名。內部類名 變量名 = new 外部類名()。內部類名();
- 成員內部類中不能存在任何static的變量和方法
- 成員內部類是依附於外部類的,只有先創建了外部類才能創建內部類
- 成員內部類可以無條件訪問外部類的所有成員變量和成員方法
- 外部類要訪問內部類的屬性和方法,必須先創建內部類對象
- 內部類破壞了良好的代碼結構,唯一的好處是不用創建外部類對象,內部類對象就可以任意訪問外部類的成員變量
- 內部類中沒有同名成員變量時,內部類會直接訪問外部類的成員變量;有同名成員變量時,直接訪問的是內部類的變量,若要使用外部類的變量,需要加this.屬性名
局部內部類
- 外部類方法中:new 內部類。方法();
- 在外部類中調用此方法,會創建內部類對象
- 如果此時我們需要往外部類的方法中傳入參數,需要用final修飾,沒有特殊含義,只是一種形式
- 內部類中只能訪問外部類方法中定義的final類型的局部變量,可以任意訪問外部類的成員變量
- 主要解決編譯問題
- 因爲外部類中的局部變量是隨方法存放在內存棧中的,方法結束這些局部變量就消失
- 而局部內部類跟其他類一樣,是在內存堆中的,不會隨方法結束而立馬消失
- 出現一種問題:局部變量銷燬了,而使用這些局部變量的局部內部類卻依然在
- 所以纔要求局部內部類使用的局部變量爲final修飾的,這樣會在內部類中拷貝一份該值,不會出現編譯問題
靜態內部類
- 使用static修飾成員內部類
- 只能訪問外部類的靜態屬性和靜態方法
- 使用外部資源,需要實例化外部類對象
- 創建時可以直接new出來對象
- 私有內部類
- 可以用private修飾內部類,這樣只能在外部類內部創建內部類
內部類的實際使用–匿名內部類
- 使用內部類的原因:
- 適當java的多繼承更加完整
- 方便將存在一定邏輯關係的類組織在一起,又可以對外界隱藏
- 方便編寫事件驅動程序
- 方便編寫線程代碼
- 在類的內部, 將內部類的定義與創建放到一起完成,這種沒有名字的類稱爲匿名內部類
- 匿名內部類可以繼承或實現一個接口,也只能是一個
- 不能定義構造器,也不能new創建實例,也只是用一次.定義 構造,第一次使用一次完成. -
- 使用內部類的原因: