日期:2014-05-19  浏览次数:20871 次

很菜的问题 但不一定能回答的很清楚
对于对象理解的不深,所以经常混淆

比如       类A     类B

A     a1=new   A(can)   //can表示参数。

这条语句是不是意味着。
1   声明一个类A的对象变量   a1.   在堆上。
2   创建一个参数为can的类A的实例。(不知道在哪)
3   将类A的实例(参数为can)的内存地址   赋值给对象变量a1.
    也就是a1在内存中存储的是个地址,地址指向的内存空间的值是类A的实例(参数为can)。
    再深入一些,那实例存储的时候,如果有许多属性之类的,是怎么存储呢?
    因为经常见到a1.p=8   这样的语句。如果a1只是存储了一个指针,那么a1.p怎么理解呢?

不知理解的是否正确。呵呵,因为一直只对数值型的运算与赋值较熟悉,对这种引用类型的一直理解的不透。

还有另外一种:

D是一个委托。H是一个函数或者方法。
D     d1=new   D(H)
该怎么理解呢?

还有     K   P都是数组   长度一样   类型也一样
那么     K=P   表示什么?
是把P[i]存储的指针赋给了K[i]?而真正指针对应地址的值没有变化,而且没有其他的副本。是这样吗?



------解决方案--------------------
将类A的实例(参数为can)的内存地址 赋值给对象变量a1
-------------
new A(can)的时候,在堆上面有了这样一个实例。
它应该有一个隐藏的对象名字 (A a = new A());
a 指向了堆上该实例的地址;
A a1=new A(can)操作后,a1也指向了a所指的地址。


如果a1只是存储了一个指针,那么a1.p怎么理解呢?
---------------
a1是指针,通过它可以找到实例在堆上的位置。
再通过a1.p就找到p的数值。//类似,数组名和下标关系

假设A a = new A(can)实例的地址是:xxxxxx
有个字符串 stirng s = "xxxxxx ";
试想a 和 s的区别。

------解决方案--------------------
1 声明一个类A的对象变量 a1. 在堆上。
a1在栈上,就像声明一个int i1,i1在什么地方,a1也一样;

2 创建一个参数为can的类A的实例。(不知道在哪)
堆上

3 将类A的实例(参数为can)的内存地址 赋值给对象变量a1
正确

委托可以简化理解为函数指针,那一句可以近似为声明一个指针然后指向函数

数组应该是只把对象指针改变指向了,你当作对象赋值即可

很久不用C#写程序了,不能保证完全准确,你还是找本比较全面的书看看好