c#和Java中的多態
阿新 • • 發佈:2018-04-25
rtu 重新 指定 demo har ati static lse 編譯器
多態:讓一個對象表現出多種類型,寫出通用的代碼,最大限度的屏蔽各個子類之間的差異性。
c#舉例:
1 將父類的方法標記為虛方法 ,使用關鍵字 virtual,這個函數可以被子類重新寫一個遍。 2 3 //真的鴨子嘎嘎叫 木頭鴨子吱吱叫 橡皮鴨子唧唧叫 4 RealDuck dk = new RealDuck(); 5 MuDark mk = new MuDark(); 6 XpDark xk = new XpDark(); 7 RealDuck [] dks = { dk,mk,xk}; 8 for(int i = 0; i < dks.Length; i++) 9 { 10 dks[i].Jiao(); 11 //調用的仍然是父類的方法,因為表現出來的類型是父類的,所以只能調用父類的方法,但是這個函數在 12 //子類中被重寫了,所以此時就不再調用自己的了,而調用重新寫的方法,具體調用哪個子類重寫的方法, 13 //取決於dks[i]裝的是誰的對象. 14 } 15 16 public class RealDuck 17 { 18 public virtualvoid Bark() 19 { 20 Console.WriteLine("真的鴨子嘎嘎叫"); 21 } 22 } 23 public class MuDuck : RealDuck 24 { 25 public override void Bark() 26 { 27 Console.WriteLine("木頭鴨子吱吱叫"); 28 } 29 } 30 public class XPDuck : RealDuck 31{ 32 public override void Bark() 33 { 34 Console.WriteLine("橡皮鴨子唧唧叫"); 35 } 36 } 37 38 39 //如果不用虛方法,則必須使用裏氏轉換法 40 如: for(int i = 0; i < dks.Length; i++) 41 { 42 if(dks[i] is MuDark) 43 { 44 (MuDark)dks[i].Jiao; 45 } 46 } 47 48 關於虛方法需要註意以下幾點: 49 1.虛方法在父類中必須有實現,哪怕是空實現(這點和抽象方法以及接口中的方法不同) 50 2.虛方法子類可以重寫(override),也可以不重寫
Java多態舉例:
多態要註意 的細節: 1. 多態情況下,子父類存在同名的成員變量時,訪問的是父類的成員變量。 2. 多態情況下,子父類存在同名的非靜態的成員函數時,訪問的是子類的成員函數。 3. 多態情況下,子父類存在同名的靜態的成員函數時,訪問的是父類的成員函數。 4. 多態情況下,不能訪問子類特有的成員。 總結:多態情況下,子父類存在同名的成員時,訪問的都是父類的成員,除了在同名非靜態函數時才是訪問子類的。 編譯看左邊,運行不一定看右邊。 編譯看左邊:java編譯器在編譯的時候,會檢查引用類型變量所屬的類是否具備指定的成員,如果不具備馬上編譯報錯。
/* 多態的應用: 1. 多態用於形參類型的時候,可以接收更多類型的數據 。 2. 多態用於返回值類型的時候,可以返回更多類型的數據。 多態的好處: 提高了代碼的拓展性。 需求1: 定義一個函數可以接收任意類型的圖形對象,並且打印圖形面積與周長。 */ //圖形類 abstract class MyShape{ public abstract void getArea(); public abstract void getLength(); } class Circle extends MyShape{ public static final double PI = 3.14; double r; public Circle(double r){ this.r =r ; } public void getArea(){ System.out.println("圓形的面積:"+ PI*r*r); } public void getLength(){ System.out.println("圓形的周長:"+ 2*PI*r); } } class Rect extends MyShape{ int width; int height; public Rect(int width , int height){ this.width = width; this.height = height; } public void getArea(){ System.out.println("矩形的面積:"+ width*height); } public void getLength(){ System.out.println("矩形的周長:"+ 2*(width+height)); } } class Demo { public static void main(String[] args) { /* //System.out.println("Hello World!"); Circle c = new Circle(4.0); print(c); Rect r = new Rect(3,4); print(r); */ MyShape m = getShape(0); //調用了使用多態的方法,定義的變量類型要與返回值類型一致。 m.getArea(); m.getLength(); } //需求1: 定義一個函數可以接收任意類型的圖形對象,並且打印圖形面積與周長。 public static void print(MyShape s){ // MyShpe s = new Circle(4.0); s.getArea(); s.getLength(); } // 需求2: 定義一個函數可以返回任意類型的圖形對象。 public static MyShape getShape(int i){ if (i==0){ return new Circle(4.0); }else{ return new Rect(3,4); } } }
c#和Java中的多態