文档章节

c#和Java中的多态

o
 osc_z1hvg4cu
发布于 2018/04/24 22:08
字数 995
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

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);
        }
    }


}

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

四面字节跳动(高级开发岗):分布式+中间件+TCP+JVM+Hashmap+ThreadLocal

字节跳动的面试官都挺好,面试的内容是我面试那么多家以来最全面的,问题也没有特别刁钻,都比较符合工作场景。 项目很重要,项目是敲门砖也是面试的大头,如果我没有简历上的两个项目的话,...

IT-哆哆
6分钟前
0
0
直播回顾

因业务需要,接触了一下直播,作为一个小白,在此做个回顾。 需求:在我们自己的APP上直播带货 调研:阿里云视频直播、腾讯云标准直播 简单地来说,直播就是把主播端采集的视频传送给用户端。...

osc_nk8pyo7o
6分钟前
7
0
神经网络中的激活函数

作者|Renu Khandelwal 编译|VK 来源|Medium 什么是神经网络激活函数? 激活函数有助于决定我们是否需要激活神经元。如果我们需要发射一个神经元那么信号的强度是多少。 激活函数是神经元通过神...

osc_993tr4xp
8分钟前
9
0
重磅!YOLOv4阅读笔记(附思维导图和论文译文)!

今天刷看到了YOLOv4之时,有点激动和兴奋,等了很久的YOLOv4,你终究还是出现了 论文地址:https://arxiv.org/pdf/2004.10934.pdf GitHub地址:https://github.com/AlexeyAB/darknet 觉得作者...

osc_zwv9uj8l
8分钟前
6
0
2.链表

点击使用幕布网页版查看(含思维导图) 链表(单链表)是一种通过指针将一组零散的内存块串联起来的数据结构,每个链表的结点除了存储的数据之外,还需要记录链上的下一个节点的地址 链表的插...

osc_73pstnki
9分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部