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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄新 中级黑马   /  2012-12-12 11:40  /  1797 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   类中的成员前面都有 public , private , internal , protected ,protected internal,consant,static 等修饰符。当这个类被实例化对象的时候 , 每种修饰符的成员是内存中是如何存储的呢。肯定是对象里的成员函数在内存的存储位置不同而控制它的访问权限的吧。比如private 修饰的成员 为什么就它的子类就不能继承到它了呢?

评分

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

查看全部评分

5 个回复

倒序浏览
public int _number;
private double _doubel;
public private 修饰的变量在堆中是依次顺序排列的!public int就会在堆中占4字节空间,private double就会在这4字节空间后边划分8字节空间存储。当然还要考虑内存对齐!因为数据放在偶数地址处,最利于CPU对其存取。对齐也可以另外通过编译器来设置,1字节对齐,2字节对齐,4字节对齐,8字节对齐,分配的地址是对齐的整数倍这是简单的对齐方式。这是针对字段的对齐方式。最后还有根据整个类对象大小来划分对象结尾处的地址应该放在哪里。也就是类对象到哪里结束;

回复 使用道具 举报
访问权限控制:这个我没有找到相关资料。不过据我已知的知识推测,有两种可能
1:编译器会在某块空间中存储一个标记,如果这个标记的某一位为1表示这个数据可访问, 为0表示不可访问,另外一位存放1表示这个数据可写,为0则不可写
2:访问权限控制完全就是编译器在控制,发现你直接访问了private那么他就报个错误,直接不给你编译生成。而正常情况下生成的程序。通过某些手段。不允许直接访问的数据还是可以访问的。这时你就要在运行时修改程序的代码了!
回复 使用道具 举报
    private修饰的字段,在子类当中,到底是继承了还是没有继承!我可以1000%肯定的告诉你继承了!只是不能直接访问。你要通过继承父类公有的方法才可以访问这块数据!
那么什么是继承?就是父类中的数据,我子类不用声明直接就已经在内存为其分配好存储空间了!父类中有的数据,在我子对象分配的存储空间中都有。那方法呢?方法我也需要重新分配空间来存储么?
直接继承的函数是不需要重新分配空间的。只要子类调用作父类的相同函数就可以了。函数的作用都是一样的,只是传参数不同罢了,所以不用重新分配空间。而那些像虚函数就要重新分配空间来存储
生成新的函数代码了!因为你执行的方式根本不一样。自然不能共用父类的方法了!

我是怎么知道这些的呢,当然是学到的了。更多的还要自己去调试,去看内存。去看相关视频,书籍。我最近正在为进黑马做准备写一些技术博客,讲得就是怎么查看内存,string在内存中是什么样的,对象呢?数组呢?基本类型呢?
本来今天想发表第一篇文章的,可惜!新注册的博客三天后才可以发表!当然有很多东西用文字是很难表达的!如果能进黑马我们再一起仔细探讨吧!

点评

说得很好,很用心  发表于 2012-12-14 11:00

评分

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

查看全部评分

回复 使用道具 举报
有一个问题,你说子类的对象从父类继承的方法的不需要重新分配内存空间。那意思就是子类的对象调用父类的对象的方法了。还是说类就算没有实例化,但类中的函数也已经被分配了内存空间了。 有什么好的查看内存的工具吗、

评分

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

查看全部评分

回复 使用道具 举报
我们的vs就是一个很好查看内存的工具!调用,看内存。最近我写了几篇博客,你可以去看下
http://blog.163.com/heima_liuwei/
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马