Ant*_*rth 3 java clone private super
这段代码今天在我的计算机科学课上提出(伴随着与这篇文章无关的几个问题).这不是家庭作业,只是我个人在代码中发现的一些问题;
public class CloneClass implements Cloneable {
private Element element ;
public CloneClass ( Element newElement ) {
element = newElement ;
}
public CloneClass clone () {
try {
// I don't understand this
CloneClass copy = ( CloneClass ) super.clone ();
// or this
copy.element = element.clone ();
return copy ;
} catch ( CloneNotSupportedException e ) {
return null ;
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先;
CloneClass copy = ( CloneClass ) super.clone ();
Run Code Online (Sandbox Code Playgroud)
我们知道super是Object(因为没有显式扩展)并且super.clone()必须返回一个实例CloneClass(它不能返回一个Object实例,因为它是抽象的,并且它是向下转换的CloneClass,因此它必须是一个CloneClass或后代实例).
我的问题; 怎么super.clone()知道返回一个CloneClass实例?
其次;
copy.element = element.clone ();
Run Code Online (Sandbox Code Playgroud)
怎么可能直接引用copy.element那样的; 它被宣布为私人!
它不是当前类的属性,它是另一个实例的属性(恰好是同一个类)
第三;
} catch ( CloneNotSupportedException e ) {
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?这种Element情况不会延长Cloneable吗?
super.clone()如何知道返回CloneClass实例?
即使在一个super方法中,this仍然指向同一个对象,所以this.getClass()会给你CloneClass(甚至是一个子类).
怎么可能像这样直接引用copy.element; 它被宣布为私人!
您不仅可以访问同一类this的其他实例,还可以访问同一类的其他实例.它只对其他类私有.
为什么需要这个?这个incase元素不会扩展Cloneable吗?
因为CloneClass可能无法扩展Cloneable(显然它可以,但是由于这个API是如何使用Object#clone设计CloneNotSupportedException而设计的,因此编译器无法建立此连接).
这在Java中是一个丑陋的设计疣.Object有一个clone方法,但Object本身不是Cloneable(它是一个标记接口).因此,您可以在不支持它的对象上调用该方法.类似的东西与Serializable.