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
虽然已经找不到这位前辈总结隐藏用法的连接,但是还是很感谢他!