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

 

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

posted @ 2020-09-23 18:47  vv彭  阅读(228)  评论(0编辑  收藏  举报