八、多態 多態(也稱作動態綁定、後期綁定或運行時綁定) 域(成員變數)是不具有多態性的,只有普通的方法調用是多態的,任何域訪問操作都將由編譯器解析,因此不是多態的 靜態方法也是不具有多態性的 public static void main(String[] args){ Super sup = ne ...
八、多態
多態(也稱作動態綁定、後期綁定或運行時綁定)
- 域(成員變數)是不具有多態性的,只有普通的方法調用是多態的,任何域訪問操作都將由編譯器解析,因此不是多態的
- 靜態方法也是不具有多態性的
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關鍵字,定義為抽象類(可以沒有抽象方法)。
- 抽象類中可以沒有抽象方法,即可以全部是含方法體的非抽象方法(可以包含已實現的成員方法)。
通過匿名類實現抽象類和介面的例子
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、內部類訪問外包類的數據
代碼輸出“外部類數據”//data這是在DataOuterClass定義的私有變數。這個變數在內部類中可以無條件地訪問.
2、實現隱藏
內部類則可以使用 private 和 protected 來修飾,內部類實現某個介面的時候,在進行向上轉型,對外部來說,就完全隱藏了介面的實現了
從這段代碼裡面我只知道OuterClass的getInner()方法能返回一個InnerInterface介面實例但我並不知道這個實例是這麼實現的。
而且由於InnerClass是private的,所以我們如果不看代碼的話根本看不到這個具體類的名字,所以說它可以很好的實現隱藏。
3、可以實現多重繼承
java 是不允許使用 extends 去繼承多個類的。內部類的引入可以很好的解決這個事情
4、普通內部類創建方法,對於非靜態內部類,內部類的創建依賴外部類的實例對象
5、內部類的分類
6、.this
與 .new
7、閉包與回調
- 閉包(closure)是一個可調用的對象,它記錄了一些信息,這些信息來自於創建它的作用域。通過這個定義可以看出內部類是面向對象的閉包,因為它不僅包含外圍類對象(創建內部類的作用域)的信息,還自動擁有一個指向此外圍類對象的引用(.this),在此作用域內,內部類有權操作所有的成員,包括private成員。
- 回調(callback),通過回調,對象能夠攜帶一些信息,這些信息允許它在稍後的某個時刻調用初始的對象。Java中沒有指針,通過內部類提供的閉包功能可以實現回調。
java閉包主要是通過介面+內部類來實現,有兩種形式:介面+內部類和介面+局部內部類