java中塑形_Java学习5——接口和多态
1 接口
接口相當于一個完全抽象的,沒有任何實現的類
所有的成員函數都是抽象函數
所有的成員變量都是public static final而且一定要賦予初值
接口中的靜態函數必須有函數體
接口在聲明時也可以聲明是泛型接口,其格式是在接口名稱后加上
使用關鍵詞interface聲明接口
[接口修飾符] interface 接口名稱[] [extends 超類名]{
... //方法的原型或靜態變量
}
實現接口使用關鍵字implements
實現接口的語法如下:
public class 類名稱 implements 接口名稱{
//實現接口的方法
//本類的數據和方法
}
類可以實現很多接口
接口不能繼承類,但是接口可以繼承接口,派生出新的接口,而且一個接口可以繼承多個接口
接口不能實現接口
2 塑型/造型
Java的對象變量是多態的,它們能保存不止一種類型的對象
它們可以保存的是聲明類型的對象,或聲明類型的子類的對象
當把子類的對象賦給父類的變量的時候,就發生了向上造型
2.1 類型轉換
類型轉換也稱為塑型(type-casting),對象只能被塑性為:
任何一個超類類型
對象所屬的類實現的一個接口
自己原來所屬的類
塑性主要應用在如下場合:
賦值轉換
方法調用轉換
算數表達式轉換
字符串轉換
當一個類對象被塑形為其超類后,它提供的方法就會減少
2.2 造型
用括號圍起類型放在值的前面
對象本身并沒有發生任何變化,所以不是“類型轉化”
運行時有機制來檢查這樣得轉化是否合理, ClassCastException
2.3 向上造型
把一個類型的對象賦給另外一個類型的變量
子類的對象可以賦值給父類的變量
注意:java中不存在對象對對象的賦值
父類的對象不能賦值給子類的對象
2.4 函數調用的綁定
當通過對象調用函數的時候,調用哪個函數這件事情叫做綁定
靜態綁定:根據變量的聲明類型來決定
在成員函數中調用其他成員函數也是通過this這個對象來調用的
3 多態
3.1 多態的定義
多態指不同類型的對象可以響應相同的消息
通過塑型可以將一個對象當做它的基類對象看待,相同基類派生出的多種類型可被當做同一種類型對待,可對這些不同的類型進行相同的處理,例如toString方法
3.2 綁定
將一個方法調用和一個方法主體連接到一起成為綁定
4 內部類
定義在別的類內部、函數內部的類
內部類能直接訪問外部的全部資源,包括任何私有的成員
外部是函數時,只能訪問那個函數里final的變量,因為方法中定義的變量是局部的,當方法的聲明周期結束時,方法中變量的生存期也結束了,但方法中定義的內部類的實例可能還在被引用。
4.1 常規內部類
OuterClass、InnerClass分別是外部類和內部類,out是OuterClass的引用,則在OuterClass外部實例化InnerClass的代碼片段為:
OuterClass out = new OuterClass();
OuterClass.InnerClass in = out.new InnerClass();
或
OuterClass.InnerClass in = new OuterClass().new InnerClass();
4.2 在方法中的內部類
對方法中定義的內部類實例化,必須在定義的的方法中,而且必須在內部類定義后方可對其實例化。
4.3 匿名內部類
匿名內部類時沒有名字的內部類,一般可分為兩種:常規定義的內部類;作為方法的參數定義的匿名內部類。常規定義的匿名內部類的聲明和使用采用如下格式:
Classname classname = new Classname(){
//類體
}; //注意,必須跟分號
其中,Classname是類或接口名,注意這是一個表達式,它返回一個對象,可以用在需要引用該對象的任何地方。
匿名內部類的方便之處:
該句法定義了一個類,但不需要類的類型;
匿名類實現了一個接口或繼承另一個類,而不需要使用implements或extends關鍵字
4.4 靜態內部類
使用了修飾符static的內部類,稱為靜態內部類。靜態內部類與包含類的實例沒有實際的聯系,因此,不能訪問包含類中的非靜態成員。實例化靜態內部類時,與常規內部類實例化不同。
實例化InnerClass代碼片段如下:
OuterClass.InnerClass in = new OuterClass.InnerClass();
一個類OuterClass中有另一個類InnerClass(外部類和內部類), 如果在main函數中使用new 的方式創建內部類的對象,會報錯:No enclosing instance of type OuterClass is accessible.
1、原因:
內部類是動態的(無static關鍵字修飾),而main方法是靜態的,普通的內部類對象隱含地保存了一個引用,指向創建它的外圍類對象,所以要在static方法(類加載時已經初始化)調用內部類的必須先創建外部類。
2、解決辦法:
創建內部類對象應該:
方法1:外部類對象.內部類對象 (保證外部類對象先于內部類對象出現)
InnerClass in = new OuterClass().InnerClass();
方法2:
如果將內部類修改為靜態類,可以在main中直接創建內部類實例。
static class InnerClass{
...
}
當在包含類內部實例化內部類時,可以直接對內部類實例化。如果在包含類的外部實例化內部類,則需要使用包含類的一個引用來實例化。
4.5 匿名類
在new對象的時候就給出類的定義形成了匿名類
匿名類可以繼承某類,也可以實現某接口
Swing的消息機制廣泛使用匿名類
總結
以上是生活随笔為你收集整理的java中塑形_Java学习5——接口和多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS中split对多个分隔符的处理
- 下一篇: The following SDK co