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

转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html

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

//定义一个名为Someone的类,代表这么一些人(通过指定年龄,性别,性格等基本信息)
class Someone {
  public int age;
  public string sex;
  public string name;
  //other...
}

//......
//创建一个Someone类的对象,代表昵称为nemo的一个特定的人
Someone nemo = new Someone();

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

Someone andy = new Someone();

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

nemo ——>|age       20      |        andy ——> |age         40        |
               |sex        “男”   |                      |sex    “男”   |
               |name  “尼 莫”|                        |name  “刘德华”|

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

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

//声明一个引用变量
Someone nemo;

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

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

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


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

时间: 2024-12-29 09:55:54

c#问答篇:对象与引用变量-----初学者的困惑的相关文章

Java千百问_06数据结构(015)_数组和普通对象的引用变量有什么区别

点击进入_更多_Java千百问 1.数组和普通对象的引用变量有什么区别 了解什么是数组看这里:java中的数组是什么 对于java的数组来说,只有类型兼容(即属于同一数据类型体系且遵守优先级由低到高原则),才能将数组引用传递给另一数组引用,但仍然不能改变数组长度(仅仅只是调整数组引用指针的指向). 了解数组传递看这里:数组如何传递 public class TestArrayLength { public static void main(String[] args) { int[] numbe

实习第二天-对象-对象引用-引用变量-精-精-精-下雨天

class Person{ } Person是一个数据类型-引用类型 数据类型-变量名   Person a;  声明一个引用类型的变量a,然后在栈中给引用变量a分配了内存空间 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术.把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路. 为便于说明,我们先定义一个简单的类: class Vehicl

每个线程单独用于对象的引用变量吗?

package Thread; import org.omg.PortableServer.THREAD_POLICY_ID; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class node{     public int num;     no

第九节(对象和引用)

Java把内存划分成两种:一种是栈内存,一种是堆内存 一. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所 分配的内存空间,该内存空间可以立即被另作他用. 二. 堆内存用来存放由new创建的对象和数组.在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同

C++引用变量(转)

引用变量 c++中引用变量的使用: 定义: int rate=80; int  & pt=rate 1.pt 是引用变量,申明引用变量时必须将其初始化.pt 和rate 的值指向相同的内存变量. 引用的最多用处就是作为函数的参数(结构和对象).通过引用变量作参数可以是函数使用原始数据.而不是拷贝. 2.引用的特点更接近于const 指针,一旦与某个变量关联起来就将一直效忠于它,可以通过初始化来设置引用,但是不能通过赋值来设置 int other=30; pt=other   ; 此时,rate的

引用成员变量 和 类对象做成员变量

注意: 1. 引用成员变量 必须在构造函数的初始化列表中进行初始化 2. 引用成员变量 并不为这个变量新辟空间:类对象做成员变量则是要对其新辟一段空间的. 如下代码中,使用date1做参数初始化person_ref和person_obj.person_ref的birth字段date1为同一个地址空间,而person_obj的birth字段则是新辟了一段空间. #include <iostream> using namespace std; class Date { int month, yea

从String s = new String(&quot;abc&quot;)了解引用变量与对象

一.引用变量与对象的区别 首先,根据我们实例bean对象过程知道,A aa;仅是声明了一个类A的引用变量,aa并不是一个对象,类的对象是通过 new来创建的. 所以,String s ....中s并不是一个对象,而是一个string类型的引用变量. 另外, 对于string字符串来讲,字符串文字本身是一个对象,如 "XXX",则 XXX就是一个对象. 二.文字池即缓冲池(pool of literal strings)和堆(heap)中的字符串对象 由于字符串对象的大量使用(一般而言对

在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]

在拷贝构造函数中为什么可以访问引用对象的私有变量? 例如: class Point { public:         Point(int xx=0,int yy=0){X=xx;Y=yy;}         Point(Point &p); private:         int X,Y; }; Point::Point(Point &p) {         X=p.X;         Y=p.Y; } 更多 0 分享到: 相关主题推荐: 对象 class yy x 相关帖子推荐:

php基础分享(第一篇 PHP引用变量)

首先我们要明白什么是引用变量概念 : 在php中引用意味着用不同的名字访问同一个变量内容:定义方式:使用&符号: php引用的工作原理<?php 定义一个变量 $arr = range(0,1000); //创建一个0到1000的数组 思考问题 $arr 变量在内存中是如何体现的呢? $arr 会在内存当中开辟一块空间来存放 定义一个变量 $array 将$arr赋值给$array $array = $arr; 思考一个问题 $array 会在内存当中创建一个新的空间吗? 其实是不会的因为p