運行時多態性是面向對象程序設計代碼重用的一個最強大機制 動態性的概念也可以被說成 一個接口 多個方法 Java實現運行時多態性的基礎是動態方法調度 它是一種在運行時而不是在編譯期調用重載方法的機制 下面就繼承和接口實現兩方面談談java運行時多態性的實現
創新互聯建站-專業網站定制、快速模板網站建設、高性價比城中網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式城中網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋城中地區。費用合理售后完善,十多年實體公司更值得信賴。
一 通過繼承中超類對象引用變量引用子類對象來實現
舉例說明
//定義超類superA
class superA
{
int i =
void fun()
{
System out println( This is superA )
}
}
//定義superA的子類subB
class subB extends superA
{
int m =
void fun()
{
System out println( This is subB )
}
}
//定義superA的子類subC
class subC extends superA
{
int n =
void fun()
{
System out println( This is subC )
}
}
class Test
{
public static void main(String[] args)
{
superA a
subB b = new subB()
subC c = new subC()
a=b
a fun() ???????? ( )
a=c
a fun() ???????? ( )
}
}
運行結果為
This is subB
This is subC
上述代碼中subB和subC是超類superA的子類 我們在類Test中聲明了 個引用變量a b c 通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用 也許有人會問 為什么( )和( )不輸出 This is superA java 的這種機制遵循一個原則 當超類對象引用變量引用子類對象時 被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法 但是這個被調用的方法必須是在超類中定義過的 也就是說被子類覆蓋的方法
所以 不要被上例中( )和( )所迷惑 雖然寫成a fun() 但是由于( )中的a被b賦值 指向了子類subB的一個實例 因而( )所調用的fun()實際上是子類subB的成員方法fun() 它覆蓋了超類superA的成員方法fun() 同樣( )調用的是子類subC的成員方法fun()
另外 如果子類繼承的超類是一個抽象類 雖然抽象類不能通過new操作符實例化 但是可以創建抽象類的對象引用指向子類對象 以實現運行時多態性 具體的實現方法同上例
不過 抽象類的子類必須覆蓋實現超類中的所有的抽象方法 否則子類必須被abstract修飾符修飾 當然也就不能被實例化了
二 通過接口類型變量引用實現接口的類的對象來實現
接口的靈活性就在于 規定一個類必須做什么 而不管你如何做 我們可以定義一個接口類型的引用變量來引用實現接口的類的實例 當這個引用調用方法時 它會根據實際引用的類的實例來判斷具體調用哪個方法 這和上述的超類對象引用訪問子類對象的機制相似
舉例說明
//定義接口InterA
interface InterA
{
void fun()
}
//實現接口InterA的類B
class B implements InterA
{
public void fun()
{
System out println( This is B )
}
}
//實現接口InterA的類C
class C implements InterA
{
public void fun()
{
System out println( This is C )
}
}
class Test
{
public static void main(String[] args)
{
InterA a
a= new B()
a fun()
a = new C()
a fun()
}
}
輸出結果為
This is B
This is C
上例中類B和類C是實現接口InterA的兩個類 分別實現了接口的方法fun() 通過將類B和類C的實例賦給接口引用a而實現了方法在運行時的動態綁定 充分利用了 一個接口 多個方法 展示了Java的動態多態性
需要注意的一點是 Java在利用接口變量調用其實現類的對象的方法時 該方法必須已經在接口中被聲明 而且在接口的實現類中該實現方法的類型和參數必須與接口中所定義的精確匹配
lishixinzhi/Article/program/Java/hx/201311/26085
多態,就是重載和重寫.重載發生在一個類中.重寫發生在子類,意思就是子類重寫父類相同名稱的方法.剛學語言有的東西,不必搞得那么清楚,只有知道怎么用就行了,有的問題你要想真正把它搞得很懂,短時間是不可能的,比如說接口,沒有幾年工作經驗你根本不可能真正理解什么是接口,甚至有的人工作四,五年也沒搞明白什么是接口,不要花太多時間去搞這些不容易搞懂的問題.
重載的特性,方法名相同.返回類型,傳入方法的參數不同(包括個數和類型).
重寫的特性,方法名相同,返回類型,參數均相同,必須發生在子類.
1.Java語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉換。
Animal animal=new Dog(); //引用變量animal引用一個Animal子類Dog的實例
Dog dog=(Dog)animal; //向下轉型,把Animal類型轉換為Dog類型
Creature creature=animal; //向上轉型,把Animal類型轉換為 Creature類型
animal=new Cat(); //引用變量animal引用另一個Animal子類Cat的實例
注:Creature這里指的是生物。
2.如果把引用變量轉換為子類類型,稱為向下轉型,如果把引用變量轉換為父類類型,稱為向上轉型。
3.在進行引用變量的類型轉換時,會受到各種限制。而且在通過引用變量訪問它所引用的實例的靜態屬性、靜態方法、實例屬性、實例方法,以及從父類中繼承的方法和屬性時,Java虛擬機會采用不同的綁定機制。
4.成員變量、靜態方法按照引用變量聲明的類型靜態綁定;實例方法按照引用變量引用的實例動態綁定。
例如,對于以下這段代碼:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
運行時將會輸出如下結果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
實現多態的三個條件(前提條件,向上轉型、向下轉型)
1、繼承的存在;(繼承是多態的基礎,沒有繼承就沒有多態)
2、子類重寫父類的方法。(多態下會調用子類重寫后的方法)
3、父類引用變量指向子類對象。(涉及子類到父類的類型轉換)
向上轉型 Student person = new Student()
將一個父類的引用指向一個子類對象,成為向上轉型,自動進行類型轉換。此時通過父類引用變量調用的方法是子類覆蓋或繼承父類的方法,而不是父類的方法此時通過父類引用變量無法調用子類特有的方法。
向下轉型 Student stu = (Student)person;
將一個指向子類對象的引用賦給一個子類的引用,成為向下轉型,此時必須進行強制類型轉換。向下轉型必須轉換為父類引用指向的真實子類類型,,否則將出現ClassCastException,不是任意的強制轉換
向下轉型時可以結合使用instanceof運算符進行強制類型轉換,比如出現轉換異常---ClassCastException
分享題目:java代碼如何實現多態 java代碼如何實現多態運行
網站網址:http://vcdvsql.cn/article34/ddseipe.html
成都網站建設公司_創新互聯,為您提供網站導航、網站維護、面包屑導航、網站排名、網站內鏈、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯