谢谢lerit的对于我的博文《内存探寻1之——值类型和引用类型的内存分配机制》中提到的问题。这里先重述问题:

"你好,你的文章写得很好,清晰了很多以前比较模糊的概念,我想提个问题,上面你总结了自定义对象的过程,那三条是按照顺序的吗?
另外,下面这个类,是先实例化字段,还是先构造器,我从第三条中看出是“初始化构造器,对对象字段初始化”,可是好像是构造函数后执行了,请指教

public class c
{
public int a = 9;
public c()
{
a = 0;
}
}"

其实我对于字段的初始化以前没有在意,在这里谢谢你的评论,使我关注到了它。我的解释是:

我的分析:

首先:我理解你的问题主要是:类中的字段(ex,上例中的 a)的初始化问题! (呵呵,希望没有错~);

其次:我对于对象的内存分配顺序是(由博文《内存探寻1之——值类型和引用类型的内存分配机制》):

1.构造实例化对象中TypeHandler所指向的对象(可认为是Method Table),包括实现接口、静态字段、方法等,并提交至Loader Heap上;

2. 初始化实例的2个附加成员(TypeHandler和SyncBlockIndex),并且将TypeHandler指针指向Method Table;

3.初始化构造器,对对象字段初始化;

我想用一例子看一下效果:

 1 //Description: 通过建立类TestClass,演示对象的内存分配机制
 2 
 3 //CopyRight: http://www.cnblogs.com/yangmingming
 4 
 5 //Notes: 为简便,将类的建立,和实例化类放于一起
 6 
 7 namespace ConsoleApplication1
 8 {
 9    public  class TestClass
10     {
11        public int c ;
12 
13        public TestClass(int cc)
14        {
15            c = cc;
16        }
17     }
18 }
19 
20 class Program
21     {
22         static void Main(string[] args)
23         {
24             TestClass tc = new TestClass(5);
25             Console.WriteLine(tc.c);
26         }
27     }
28 //输出为:5 

为说明方便,我们在15行设定断点,经调试,其界面为:

可见,如你所言,对象中字段在调用构造函数前,已经有值了!然而在这里我想我们的理解会有误差,具体分析如下:

一: 我上面所讲的"初始化构造器,对对象字段初始化",可以肯定的说,你理解的与我不同(呵呵,必须的~)。我的理解是——调用构造函数,而其主要作用是对其中字段初始化!(你的理解是先后顺序执行?!);

二:我认为可以认为类中字段的直接赋值(如你例中:public int a = 9;) 为在内存直接分配完毕后,给字段相应位置赋值,这或许可以被称为字段初始化(虽然我对这种方式不甚熟悉)。即:对字段的赋值是在我的上述对象内存分配过程3过程之前执行的!

三:从我的上例中看到,当未对字段赋初值时(实质上,系统出于C#的类型安全性要求会对字段类型分别赋初值0或null), 在调用构造函数前字段已经采取了初始赋值:0;

附:之所以会对我的说明产生误解(或者,我的说明不清晰)主要因为

1;在C++中,构造函数的作用即:为字段赋初值;

2:关于初始化,在C++中是不允许直接使用: public int a = 9;的,这样会报错。它采用了一种比较特殊的为字段初始化的方式(提供默认值-声明与定义分离,这里不阐述)。而C#中的字段初始化应在内存分配完成后直接完成的;

3:因为我虽然学习了C#,可能由于还没有在工作中更多实践,所以C++思想还很"丰富"的缘故(呵呵,尽快转变~);

最后,还是感谢lerit的问题,让我有了更多思考,希望以后继续交流!

转载于:https://www.cnblogs.com/yangmingming/archive/2010/02/09/1666859.html

回复:lerit的关于对象中字段的初始化问题相关推荐

  1. 结构和类中字段的初始化以及用new来操作他们的构造函数

    //在下面的示例中,通过使用 new 运算符创建并初始化一个 struct 对象和一个类对象,然后为它们赋值.显示了默认值和所赋的值. using System; struct SampleStruc ...

  2. 替换对象所有字段_JVM字段访问优化

    只有经历过地狱般的磨砺,才能练就创造天堂的力量:只有流过血的手指,才能弹出世间的绝响.--泰戈尔 在实际中,Java程序中的对象或许 本身就是逃逸 的,或许因为 方法内联不够彻底 而被即时编译器 当成 ...

  3. java 对象验证非空_判断Bean对象指定字段非空

    判断Bean对象指定字段非空. 方案: 在bean对象上增加注解,指定字段非空,返回异常信息有明确字段描述,省去不必要的if.else判断. 新建注解类 /** * 参数校验,判断字段非空.返回异常文 ...

  4. java get null_java 获取对象中为null的字段实例代码

    下面一段简单的代码给大家分享java 获取对象中为null的字段,具体代码如下所述: private static String[] getNullPropertyNames(Object sourc ...

  5. java对象序列化去掉字段_使用序列化查找对象中的脏字段

    java对象序列化去掉字段 假设您正在开发一个将对象自动保存到数据库中的框架. 您需要检测两次保存之间所做的更改,以便仅保存已修改的字段. 如何检测脏场. 最简单的方法是遍历原始数据和当前数据,并分别 ...

  6. 使用序列化查找对象中的脏字段

    假设您正在开发一个将对象自动保存到数据库中的框架. 您需要检测两次保存之间所做的更改,以便仅保存修改过的字段. 如何检测脏场. 最简单的方法是遍历原始数据和当前数据,并分别比较每个字段. 代码如下: ...

  7. java对象添加字段_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的new语句之外,我们还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstance 方法来 ...

  8. Vue中为对象添加字段

    本文首发于我的个人博客 本文记录了作者使用Vue.js,并且在前端中为对象添加字段时遇到的坑点. 场景与问题 从后端拿到数据之后,可能为了渲染时的方便,想要在对象里添加一些字段,而后直接在渲染时引用 ...

  9. js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法

    js给对象添加变量属性 & js 更改对象中的属性名 & 数组对象中每个对象添加一个字段-map用法和forEarch用法 1.js给对象添加变量属性 1.js创建一个对象或者在原有对 ...

最新文章

  1. Python 标准库之 fcntl
  2. VMware Ubuntu 全屏问题解决
  3. 华为上机试题 c语言,华为上机考试题库2017 2017年全国计算机等级考试C语言上机考试题库 -1-20套.doc...
  4. 转载 用Python实现设计模式——工厂模式
  5. GetModuleFileNameA函数与GetCurrentDirectoryA函数
  6. Tuxera NTFS 2020.2 for Mac 磁盘格式读写
  7. 小游戏策划案例精选_最具创意大型活动策划案例
  8. python微信自动发消息系统
  9. 高通CSR8670蓝牙音频芯片怎么样?CSR8670处理器参数介绍
  10. 计算机专业类的数学难吗,学计算机专业难吗数学很差能学吗
  11. 只有PHP大牛才能读懂的内涵图
  12. 奶制品生产与销售matlab,奶制品生产和销售
  13. Python工程师面试必备25条Python知识点
  14. 宝付正式执行“适当降低小微企业支付手续费”工作部署任务
  15. 什么是DevOps的三步工作法?
  16. 基于Java毕业设计影院网上售票系统源码+系统+mysql+lw文档+部署软件
  17. PHP中调用http接口
  18. Java中内存溢出和内存泄露详解
  19. Win10删除|修改鼠标右键快捷键快捷菜单的操作
  20. Android .9图片制作教程(二)

热门文章

  1. 【Jenkins系列1】Jenkins定时任务设置
  2. 敏捷个人课后练习四主题:我想要什么?
  3. nboot,eboot和uboot
  4. javascript学习1---用dom对象动态控制表格
  5. 入围51CTO 2009年度“最受读者欢迎的IT图书作者”评选
  6. 微软Java面试题-按照字母排序
  7. 用户自助查看kubectl使用的证书状态以及如何更新
  8. 记录第一次使用jni编译so包的入门操作
  9. timeSetEvent
  10. thinkphp3.2 验证码生成和点击刷新验证码