本帖最后由 rla540 于 2012-12-14 19:20 编辑
上图,看代码
这是一段很简单的代码,父类中有三个私有字段,和用来设置私有字段变量的三个公共方法。子类Student继承自父类Person。子类Student中没有声明任何字段,那么父类中的私有字段在子类中继承了没有呢?也就是说在创建子类对象时,子类对象在堆内存空间中有没有为父类中所含有的数据开辟空间呢? F10走。把子类对象变量HeiMa添加到监视窗口,我们取下他的地址:
好找们已经找到对象HeiMa真正的藏身之处了。在内存查看窗口地址栏中输入这个地址值
0x016a13d0并回车
这时按下F10单步走一下执行HeiMa.SetName("黑马程序员");
这条语句。看下,HeiMa在堆中内存的变化
再按下F10执行HeiMa.SetAge(100);
最后按下F10观察_Weight变量的变化:
嗯,这时我想不用我说你就已经知道父类中的私有字段在子类当中到底有没有继承了吧?可以1000%地说继承了!只是不能由子类直接调用,而是通过继承父类中公有方法间接来调用的!当然调用父类的构造函数来初始化这些数据也是可以地(前提是父类中为我们提供了相关构造)。
好了我们再看看0x016a13b8中到底保存得是不是“黑马程序员”;输入到内存监视窗口走
一片乱码,怎么回事,嗯,别着急,这是因为内存查看窗口默认是按ANSI来解释内存中的数据的,让我们在内存查看窗口上单击鼠标右键勾选:Unicode文本
哈哈奇迹产生了:
有兴趣的再把这几个内存值写到程序里看下:
Console.WriteLine("{0}{1}{2}{3}{4}", (char)0x9ed1, (char)0x9a6c, (char)0x7a0b, (char)0x5e8f, (char)0x5458);
除了上边这些你还有没有发现什么规律?
栈中变量是从高地址依次身低地址存放,堆中呢,也是一样的哦!!观察,多思考。哦了 |