知识卡片
clone拷贝对象时构造函数不会被执行
内容
用new创建对象会执行构造函数,但对它调用clone()产生的新对象不会再次触发构造函数——因为 Object的clone方法本质是从堆内存以二进制流方式拷贝,不经过Java语言层面的构造函数调用 路径,这与new运算符触发的创建流程完全不同。发散:这解释了为什么”逃避构造函数约束”是 原型模式与生俱来的特性,只要用clone而非new,构造函数被跳过就是必然结果。
参考来源
- 位置:《设计模式之禅(第2版)》第13章《原型模式》(源文件:_epub-src/text/part0060.html)
- 结论依据:原文用Thing类的实验证明new会打印"构造函数被执行了..."而clone不会再次打印,并解释"Object类的clone方法的原理是从内存中(具体地说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了"。
- 原始内容:在对象拷贝时构造函数B是不会被执行的……对象拷贝时构造函数确实没有被执行,这点从原理来讲也是可以讲得通的,Object类的clone方法的原理是从内存中……以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了。