zoukankan      html  css  js  c++  java
  • 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是引用变量。
  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/sheseido/p/4989148.html
Copyright © 2011-2022 走看看