码迷,mamicode.com
首页 > 编程语言 > 详细

c#和Java中的多态

时间:2018-04-24 23:14:29      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:java   存在   必须   console   highlight   转换   编译   圆形   etl   

多态:让一个对象表现出多种类型,写出通用的代码,最大限度的屏蔽各个子类之间的差异性。

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中的多态

标签:java   存在   必须   console   highlight   转换   编译   圆形   etl   

原文地址:https://www.cnblogs.com/qicao/p/8934104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!