zoukankan      html  css  js  c++  java
  • C#学习笔记之一——面向对象与NEW关键字

    一、理解面向对象编程

    1.C#,是纯面向对象编程。

      所谓面向对象编程,我个人理解是,我们只用对象去实现我们的功能,这样可以很容易达到重复利用。过去用C编程时,我们要用重复的代码,首先考虑到肯定是声明一个函数来封装,使用时再调用即可。但是我想重复使用一类代码(比如创建一个窗体的代码),我们用面向过程的方式去归这一类代码比较困难,而且调用起来也不灵活,于是出现了 ”类“ 这个玩意,对应的便是面向对象编程。

    2.C#,创建对象变量。

      格式:类名 对象名;

      是不是看起来像在C语言中声明一个变量。没错,格式是一模一样。而且在面向对象编程语言中(C#、java等),万物皆对象。你声明一个变量,比如:sting str;,”str“也是对象。我们声明对象变量就用类名去声明就好了。上面我们声明了一个可以放对象的变量,但是它里面啥也没有,可以理解为创建了一个可以放该类型的空盒子。其实它的默认值是”null“,就是没有分配内存。

      假设有一个类叫“服装”,然后我想声明一个盒子(对象变量)叫“裤子1号”,具体操作就是 :“ 服装 裤子1号;”

    3.C#,创建对象(实例化)。

      格式:new 类的构造函数();

      先缕清几个词语:

      对象:名词,就是从抽象类中造出来实物。比如”服装“,这个名词比较抽象,没有具体的说明是这件上衣还是那条裤子。那么我们就要把它具体化,”new 服装类构造函数()“,这里得到的是一个”衣服“的具体对象,于是对象就创出来了,可以存到变量里,也可以直接创建出来被引用。

      对象变量:名词,就是类似普通变量,存放相应对象的变量。

      实例化:动词,创建对象的过程叫做实例化。

      在C#中”new“关键字功能很多,下面会详细一起谈。最常用功能的就是实例化。

    4.C#,为对象变量赋值。

      格式:对象变量名 = 对象;

      和变量赋值一模一样,就是把对象赋给对象变量。

      比如: 裤子1号 = new 服装();

      上面的“裤子一号”是提前声明了的,也可以连在一起:服装 裤子 = new 服装();声明对象变量的同时,实例化并赋值。

    5.C#,构造函数。

      创建对象时调用的方法。它的名字是和类名一样的。默认构造函数是不带参数的,也没有其他逻辑内容,并且隐藏起来的,就是你创建一个类时,不会显示构造函数。

      可以显式重写构造函数,在里面实现一些逻辑,这些逻辑都是在创建对象时实现的。

      还可以重载构造函数,即声明带参数的构造函数,比如声明一个服装的构造函数,有一个参数,参数类型为sting,用来定义这个服装的面料。

      使用这个构造函数例子如下:

      服装 睡衣 = new 服装(string 纯棉);

      服装 外套 = new 服装(string 羽绒);

      如果还想使用无参构造函数,必须声明一个无参构造函数,因为匿名那个已经被重写了,所以只能重载一个无参构造函数。

    6.C#,析构函数。

      析构函数,用来回收对象的,即释放对象所占的内存。正常情况下,我们不需主动调用析构函数,因为C#有垃圾自动回收功能,但是不能小瞧这个功能,正所谓存在即合理,我这里就先不谈它,留下15个坑,到时候有空专门写一遍文章浅谈它的妙处。

         坑坑坑坑坑

      坑坑坑坑坑

      坑坑坑坑坑

    二、new 的用法总结

    1.创建对象

      如 Animal cat = new Animal();

      new出的对象也可以直接引用

      如 声明了一个函数 void Eat(Animal myAnimal),它的参数是Animal类型,调用是可以这样子Eat(new Animal);

    2.也用于为值类型调用默认的构造函数
      例:int num= new int();
      num 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;



    3.new 修饰符式隐藏从基类继承的成员
      本人比较懒,下面代码随便网上找了一些粘贴:

    public class MyClass
    
    {
        public int x;
        public void Invoke() {}
    }


    在派生类中用 Invoke 名称声明成员会隐藏基类中的 Invoke 方法,即:

    public class MyDerivedC : MyClass
    {
        new public void Invoke() {}
    }


    通过继承隐藏名称采用下列形式之一:

    1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。

    2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。

    3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

    4.在同一成员上同时使用 new 和 override 是错误的。



    注意:在不隐藏继承成员的声明中使用 new 修饰符将生成警告。

    示例

    在该例中,基类 MyBaseC 和派生类 MyDerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。该例说明了 new 修饰符的使用。同时也说明了如何使用完全限定名访问基类的隐藏成员。

    using System;
    
    public class MyBaseC
    {
        public static int x = 55;
        public static int y = 22;
    }
    public class MyDerivedC : MyBaseC { new public static int x = 100; // Name hiding

    public static void Main() { // Display the overlapping value of x: Console.WriteLine(x); // Access the hidden value of x: Console.WriteLine(MyBaseC.x); // Display the unhidden member y: Console.WriteLine(y); } }
    输出
    100
    55
    22



    如果移除 new 修饰符,程序将继续编译和运行,但您会收到以下警告:

    The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

    如果嵌套类型正在隐藏另一种类型,如下例所示,也可以使用 new 修饰符修改此嵌套类型。

    示例

    在该例中,嵌套类 MyClass 隐藏了基类中具有相同名称的类。该例不仅说明了如何使用完全限定名访问隐藏类成员,同时也说明了如何使用 new 修饰符消除警告消息。

    using System;
    
    public class MyBaseC
    {
        public class MyClass
        {
            public int x = 200;
            public int y;
        }
    }
    
    public class MyDerivedC : MyBaseC
    {
        new public class MyClass // nested type hiding the base type members
        {
            public int x = 100;
            public int y;
            public int z;
        }
    
        public static void Main()
        {
            // Creating object from the overlapping class:
            MyClass S1 = new MyClass();
            // Creating object from the hidden class:
            MyBaseC.MyClass S2 = new MyBaseC.MyClass();
            Console.WriteLine(S1.x);
            Console.WriteLine(S2.x);
        }
    }
    输出
    100
    200

    虽然已经找不到这位前辈总结隐藏用法的连接,但是还是很感谢他!

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/eve612/p/13720208.html
Copyright © 2011-2022 走看看