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

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

  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)【转】
    Shadow Map 原理和改进 【转】
    OSG 中文解决方案 【转】
    shadow mapping实现动态shadow实现记录 【转】
    RenderMonkey 练习 第六天 【OpenGL Water 水效】
    glsl水包含倒影的实现(rtt) 【转】
    Docker镜像仓库Harbor之搭建及配置
    docker登录没有配置https的harbor镜像仓库
    Git 清除远端已删除的分支
    单节点k8s的一个小例子 webapp+mysql
  • 原文地址:https://www.cnblogs.com/eve612/p/13720208.html
Copyright © 2011-2022 走看看