1. 程式人生 > >c#和Java中的多態

c#和Java中的多態

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 virtual
void 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中的多態