c#问答篇:对象与引用变量-----初学者的困惑
转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html
从宏观的角度来看,对象是类的实例。比如:
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类的对象:
对象nemo和对象andy是相同的吗?他们仅仅是名字不同而已吗?不——因为每个对象的变量的值不同!比如:
|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语言的指针变量),它本身并不是一个对象!
| ——|————>100| 20 | age
| “男” | sex
| “尼 莫” | name
现
在你理解了为什么说类是引用类型了吧?——类对象通过引用来访问呀!同时,也说明了为什么上文说“nemo和andy是两个不同的对象”——运行时为对象
动态分配内存,所以两个对象所在的内存地址不同,当然两个对象是不同的咯!——等等,你刚刚不是说nemo是引用变量吗?怎么又说“nemo...
是...对象”了呢?
笔者在初学时在理解上存在这样的困惑!
但是,你可能注意到了,Someone是一个类,而nemo自然就是声明为这个类的一个变量;而类作为一种类型,它是属于引用类型,所以nemo自然就是一个引用类型的变量即引用变量了啊。
关键的一点是,我们可以从不同的角度来看这一问题:宏观上,nemo是对象;而微观上,深层的理解,nemo是引用变量。
最新文章
- String.Format 格式说明
- Java生成和操作Excel文件(转载)
- 实例讲解表单验证插件Validation的应用
- BGP学习笔记
- eclipse代码编辑快捷键
- Kafka-0.10.0.0入门
- 第五篇、 WebSphere8.5的安装
- UITextFiled自动补全输入,选中补全内容。NSRange和UITextRange的相互转换。-b
- Linux多线程服务端编程:使用muduo C++网络库
- ARM汇编指令集
- 【转】C\C++代码优化的27个建议
- JDBC 数据库连接操作——实习第三天
- Centos设置防火墙与开放访问端口
- HDU ACM 1690 Bus System (SPFA)
- FineUIPro v4.0.0 发布了,全新 CSS3 动画惊艳登场!
- intent.setFlags方法中的参数值含义
- 20165321预备作业3:Linux安装及命令入门
- WebDriver API——第2部分Exceptions
- Jmeter JDBC执行多条SQL
- apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
热门文章
- 1088-Gnome Sequencing
- cxf2.4.3中jaxb-api.jar、jaxws-api.jar与jdk1.6.0_02不兼容问题
- Cocos2d-x 3.2编译Android程序错误的解决方案
- easyui源码翻译1.32--SplitButton(分割按钮)
- configure文件中判断某函数或库是否存在的一个方法
- 冒泡排序BubbleSort
- 【HDOJ】2102 A计划
- ruby2.2.2在msvc2010上编译
- 如何使用eclipse进行嵌入式Linux的开发
- 解决Dagger2和butterknife冲突