A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rla540 中级黑马   /  2012-12-14 19:17  /  1641 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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);
除了上边这些你还有没有发现什么规律?

栈中变量是从高地址依次身低地址存放,堆中呢,也是一样的哦!!观察,多思考。哦了

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马