对于对象理解的不深,所以经常混淆比如   类A  类BA  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]?而真正指针对应地址的值没有变化,而且没有其他的副本。是这样吗?

解决方案 »

  1.   

    将类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的区别。
      

  2.   

    1 声明一个类A的对象变量 a1. 在堆上。
    a1在栈上,就像声明一个int i1,i1在什么地方,a1也一样;2 创建一个参数为can的类A的实例。(不知道在哪)
    堆上3 将类A的实例(参数为can)的内存地址 赋值给对象变量a1
    正确委托可以简化理解为函数指针,那一句可以近似为声明一个指针然后指向函数数组应该是只把对象指针改变指向了,你当作对象赋值即可很久不用C#写程序了,不能保证完全准确,你还是找本比较全面的书看看好