🔷 一、super.clone()
并不是调用构造器 super()
它不是在调用构造函数 super()
,而是调用父类的 clone()
方法!
对比说明:
表达式 | 含义 |
---|---|
super() | 调用父类的构造函数,用于创建对象。只能在构造器里使用。 |
super.clone() | 调用父类的 clone() 方法,是方法调用,跟构造器无关。 |
🔷 二、为什么 super.clone()
是必须的?
Java 中 Object.clone()
的默认行为:
-
所有类的祖先
java.lang.Object
有一个protected Object clone()
方法。 -
这个方法做了以下事:
- 直接创建一个当前对象的浅拷贝。
- 不会调用构造函数(这是关键!)
- 它是通过内存复制实现的,而不是通过
new
和构造函数。
🔷 三、那为什么用 super.clone()
而不是 new MyClass()
?
原因是:clone()
是 Java 的一种特殊对象复制机制,它跳过了构造器的调用。
如果用 new
:
MyClass copy = new MyClass(); // 会调用构造器
- 会导致你必须手动设置所有字段;
- 构造器可能有副作用,逻辑复杂;
- 不符合“复制一个已有对象”的语义。
🔷 四、层层调用机制(继承中的 super.clone()
)
当你写:
super.clone()
实际调用的是:
- 当前类的父类的
clone()
方法; - 这个过程可以一直向上追溯,最终调用
Object.clone()
; Object.clone()
是 native 方法,在底层通过内存操作复制对象,不经过构造器。
✅ 总结
项 | 内容 |
---|---|
super.clone() 是什么? | 是调用父类的 clone() 方法,不是构造函数 |
跟 super() 构造器有关系吗? | 没有任何关系 |
为什么用 super.clone() ? | 为了利用 Java 内置的对象浅拷贝机制,不调用构造器,直接复制已有对象 |
哪个方法最终执行拷贝? | Object.clone() |