浅谈对象的内存分配及对象的成员的访问(二)

上一次讨论了关于对象中成员变量在内存中的分配以及对类的成员访问的一些细节,但是我们讨论
的成员变量只是值类型的,今天我们来继续讨论下复杂的类型也就是如果类的成员是引用类型的情
况下,我们的对象在内存中是如何分布以及如何访问的,首先看下面的例子:
//定义一个学生类
class Student
{
  public int id; //学生编号
  public string name; //学生姓名
  
}
//定义一个教师类,为了讨论问题的方便,我们只考虑一个老师只带一个学生,那么在
//教师类中就必然要知道学生的相关信息
class Teacher
{
   public string teaName; //教师姓名
   public Student stu; //保存一个Student类型的变量,方便老师知道学生的信息
  
   //为了更好的讨论复杂类型,暂时在构造方法中只对教师的名字初始化
   public Teacher(string name)
   {
this.teaName = name;
   }
   //...  
}
那么我们开始创建进行教师类的实例化 Teacher tea = new Teacher("wsmall"),从上一次的讨论
中我们很容易知道上面的操作将会在堆区开辟一块内存用来保存创建的教师的对象的信息,另外还
需要在栈区开辟一块内存放置堆上面的开辟的内存的首地址。
在堆区开辟的的内存上会有成员变量teaName的位置,而且保存的值是我们给定的初始值:wsmall
,但是我们成员变量stu的值是什么呢?同样从上次的讨论中,我们知道stu只保存了一个地址,一
个指向堆上面的地址,如果我们在stu的初始化的时候如果不给定任何值,那么stu就是一个空地址
,我们把它叫做空引用,表示他不指向任何地方,也就是stu= null, 如图: 
 
这时候我们再继续下面的操作:
Student stuTmp = new Student();
tea.stu = stuTmp;
这时候tea所指向的堆中的stu就不在是一个空引用了,我们给他赋值了,stuTmp指向哪里,stu就
指向哪里,堆上面的内容发生变化,如图:

想在我们就可以通过 string stuName = tea.stu.Name 的方式来对学生对象进行操作了,如图:



这下大家看懂了吗 ^_^   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值