C#复习(五)多态、内存_该用户还没想到昵称_新浪博客



一、多态(某种事物出现的多种形态)
  • 函数具有多态性:重载、重写。
  • 多态的前提:a.想让一个事物具备另一种事物的形态,要么继承,要么实现;b.一定要有覆盖。
  • 多态的好处:提高了代码的扩展性,便于后期维护。
  • 多态的弊端:前期写的代码无法使用后期特有的内容。
  • 多态在代码中的体现:父类或接口的引用指向其子类对象。
class Program
    {
        static void Main(string[] args)
        {
            USB u = new Mouse();    //注意是父类= new 子类对象()。不是Mouse m=new USB();
            Method(u);
            u = new KeyBoard();
            Method(u);
            //Method(new KeyBoard()); //类型向上转化(向父类转换)(自动转换)
            Console.ReadLine();
        }

        public static void Method(USB u)
        {
            if(u is Mouse )
            {
                u.print();
                Mouse m = u as Mouse; //类型向下转化(向子类转换)(强制类型转换)或者写成Mouse m=(Mouse)u,作用:调用子类特有功能
                m.print();
                m.Move();
            }
            if (u is KeyBoard)
            {
                u.print();
                KeyBoard k = u as KeyBoard;
                k.print();
                k.Move();
            }
        }
    }  
    class USB
    {
        public string name = "USB";
        public  void print()
        {
            Console.WriteLine(name+"    Print");
        }
    }

    class Mouse : USB
    {
        public new string name = "Mouse";
        public new void print()
        {
            Console.WriteLine(name +"    mouse_Print");
        }
        public void Move()
        {
            Console.WriteLine(name + "    mouse_Move");
        }
    }
    class KeyBoard : USB
    {
        public new void print()
        {
            Console.WriteLine(name+"     KeyBoard_Print");
        }
        public void Move()
        {
            Console.WriteLine(name+"     KeyBoard_Move");
        }
    }
结果为:
USB    Print
Mouse    mouse_Print
Mouse    mouse_Move
USB    Print
USB     KeyBoard_Print
USB     KeyBoard_Move
结论: 子类继承父类,运用new关键字时,对于变量来说:编译时,参考变量所属类型(看左边)中是否有调用的成员变量,有则通过,没有则报错;运行时,参考变量所属类型(看左边)中是否有调用的成员变量,有则运行该变量。对于函数来说,编译时,参考变量所属类型(看左边)中是否有调用的成员函数,有则通过,没有则报错;运行时,参考变量所属类型(看左边)中是否有调用的成员函数,有则运行该函数( 创建子类对象当父类型,eg:USB u = new Mouse();调用父类方法)

 class Program
    {
        static void Main(string[] args)
        {
            USB u = new Mouse();
            Method(u);
            u = new KeyBoard();
            Method(u);
            Console.ReadLine();
        }

        public static void Method(USB u)
        {
            if(u is Mouse )
            {
                u.print();
                Mouse m = u as Mouse;
                m.print();
                m.Move();
            }
            if (u is KeyBoard)
            {
                u.print();
                KeyBoard k = u as KeyBoard;
                k.print();
                k.Move();
            }
        }
    }

     class USB
    {
        public string name = "USB";
        public virtual  void print()
        {
            Console.WriteLine(name+"    Print");
        }
    }

    class Mouse : USB
    {
        public new string name = "Mouse";
        public override void print()
        {
            Console.WriteLine(name +"    mouse_Print");
        }
        public void Move()
        {
            Console.WriteLine(name + "    mouse_Move");
        }
    }
    class KeyBoard : USB
    {
        public override  void print()
        {
            Console.WriteLine(name+"     KeyBoard_Print");
        }
        public void Move()
        {
            Console.WriteLine(name+"     KeyBoard_Move");
        }
    }
结果为:
Mouse    mouse_Print
Mouse    mouse_Print
Mouse    mouse_Move
USB     KeyBoard_Print
USB     KeyBoard_Print
USB     KeyBoard_Move
结论: 子类继承父类,运用override关键字时,对于变量来说,只能用new 关键字。对于方法来说,参考这个对象(看右边)中是否有调用的方法,有则调用,没有则调用父类。( 创建子类对象当父类型,eg:USB u = new Mouse();调用子类方法)

二 、内存
  • 内存的划分:寄存器(被CPU处理)、本地方法区、方法区、栈内存、堆内存
  • 栈内存:存放局部变量,先进后出,更新速度快,会自动更新,出栈即弹栈,入栈即压栈
   堆内存:存放数组、对象,凡是用new建立的东西都存在于堆中,堆内存是不会随时释放的
  • null为引用数据类型
    int[] arr=new int[6];
    arr=null;//把arr引用的地址赋值为null
    System.Console.WriteLine(arr[0]);//异常
  • 常见异常:
    a.NullreferenceException:空引用异常
    b.IndexOutOfRangeException:索引越界异常
    c.InvalidCastException:类型转换异常
  • 如果一个实体(对象)没有其他变量引用其地址值时,就会变成垃圾。垃圾不会随时释放,没有具体的对象地址值,在C#中有一种很优秀的机制叫垃圾回收机制。垃圾回收机制回收垃圾是不定时的,完全随机。
 class Program
    {
        static void Main(string[] args)
        {
            Car c1 = new Car();
            Car c2 = new Car();
            c1 = c2;
            c1.num = 1;
            c2.num = 2;
            c2.color = "yellow";
            c1.Run();
            c2.Run();
            Console.ReadLine();
        }     
    }
    class Car
    {
        public int num;
        public string color;
        public void Run()
        {
            Console.WriteLine(num + ".." + color);
        }
    }
结果为:2..yellow
     2..yellow
C#复习(五)多态、内存


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值