对象与引用变量-----初学c#者的困惑

时间:2022-12-12 16:49:13

从宏观的角度来看,对象是类的实例。比如:

对象与引用变量-----初学c#者的困惑//定义一个名为Someone的类,代表这么一些人(通过指定年龄,性别,性格等基本信息)
对象与引用变量-----初学c#者的困惑
class Someone {
对象与引用变量-----初学c#者的困惑  
public int age;
对象与引用变量-----初学c#者的困惑  
public string sex;
对象与引用变量-----初学c#者的困惑  
public string name;
对象与引用变量-----初学c#者的困惑  
//other...
对象与引用变量-----初学c#者的困惑
}

对象与引用变量-----初学c#者的困惑
对象与引用变量-----初学c#者的困惑
//......
对象与引用变量-----初学c#者的困惑
//创建一个Someone类的对象,代表昵称为nemo的一个特定的人
对象与引用变量-----初学c#者的困惑
Someone nemo = new Someone();

这时,我们会象通常所说的那样讲到:我们创建了一个名为nemo的Someone类的对象(是的,这没有错,但它会和下文所讲的一些内容产生些许理解上的困惑)。因为每当创建类的一个实例(昵称为nemo的某人),就创建该类的一个对象(名为nemo的Someone类的对象),而每个对象自身包含类中定义的所有实例变量(age,sex,name等)的一个拷贝,所以说对象nemo是Someone类的实例。顺便,我们再创建一个名为andy的Someone类的对象:

对象与引用变量-----初学c#者的困惑Someone andy = new Someone();

对象nemo和对象andy是相同的吗?他们仅仅是名字不同而已吗?不——因为每个对象的变量的值不同!比如:

对象与引用变量-----初学c#者的困惑nemo ——>|age        20       |        andy ——> |age          40       |
对象与引用变量-----初学c#者的困惑                |sex        “男”    |                       |sex    “男”    |
对象与引用变量-----初学c#者的困惑                |name   “尼 莫”|                         |name   “刘德华”|

所以nemo和andy是两个不同的对象,唯一相同的是它们都属于同一种类型——Someone类!


而从微观的角度来看,我们前面所说的“对象nemo”真的是对象吗?你可能会奇怪我怎么会这么问...
实际上,
Someone nemo = new Someone();
这一创建一个Someone类的对象的过程分为两步:

对象与引用变量-----初学c#者的困惑//声明一个引用变量
对象与引用变量-----初学c#者的困惑
Someone nemo;
对象与引用变量-----初学c#者的困惑
对象与引用变量-----初学c#者的困惑
//创建一个Someone类的对象,new运算符使运行时为该对象动态的分配内存;
对象与引用变量-----初学c#者的困惑
//然后返回该对象所在的内存地址,并赋于变量nemo,从而引用变量nemo指向该对象
对象与引用变量-----初学c#者的困惑
nemo = new Someone();

此时,对于nemo的理解应该是:nemo是一个引用新创建的Someone类对象的变量(如同c语言的指针变量),它本身并不是一个对象!

    引用变量nemo             对象所在内存地址(设运行时为其分配起始地址为100号的连续内存单元)  
    |          ——|————>100|      20      | age
                                      |    “男” | sex
                                        | “尼 莫” | name

现在你理解 了为什么说类是引用类型了吧 ?——类对象通过引用来访问呀!同时,也说明了为什么上文说“nemo和andy是两个不同的对象”——运行时为对象动态分配内存,所以两个对象所在的内存地址不同,当然两个对象是不同的咯!——等等,你刚刚不是说nemo是引用变量吗?怎么又说“nemo...是...对象”了呢
笔者在初学时在理解上存在这样的困惑
但是,你可能注意到了,Someone是一个类,而nemo自然就是声明为这个类的一个变量;而类作为一种类型,它是属于引用类型,所以nemo自然就是一个引用类型的变量即引用变量了啊。
关键的一点是,我们可以从不同的角度来看这一问题:宏观上,nemo是对象;而微观上,深层的理解,nemo是引用变量。