如果我有:
class foo implements Cloneable
Run Code Online (Sandbox Code Playgroud)
然后做:
bar = new foo();
bar.clone();
Run Code Online (Sandbox Code Playgroud)
我得到一个浅拷贝而不需要编写任何bar.clone()代码,就像我通常在实现接口时需要做的那样.
我的理解是接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,"类对象本身不实现接口Cloneable")
那么我的浅层克隆来自哪里?bar.clone()如果Object.clone()没有实现,那么实现的代码在哪里?我糊涂了.
我正在使用一个内部类,它是HashMap的子类.我有一个String关键和double[]价值观.我每次存储约200个双打double[].我应该使用大约700 MB来存储密钥,指针和双打.然而,内存分析显示我需要更多(略多于2 GB).
使用TIJmp(分析工具)我看到有一个char[]使用了几乎一半的总内存.TIJmp表示char[]来自Serializable和Cloneable.其中的值范围从字体列表和消息和单个字符的默认路径.
SerializableJVM中的确切行为是什么?它是否始终保持"持久"副本,从而使我的内存占用量增加一倍?如何在运行时编写对象的二进制副本而无需将JVM转换为内存占用?
PS:内存消耗增加最多的方法是下面的方法.该文件每行大约有229,000行和202个字段.
public void readThetas(String filename) throws Exception
{
long t1 = System.currentTimeMillis();
documents = new HashMapX<String,double[]>(); //Document names to indices.
Scanner s = new Scanner(new File(filename));
int docIndex = 0;
if (s.hasNextLine())
System.out.println(s.nextLine()); // Consume useless first line :)
while(s.hasNextLine())
{
String[] fields = s.nextLine().split("\\s+");
String docName = fields[1];
numTopics = fields.length/2-1;
double[] thetas = new double[numTopics];
for …Run Code Online (Sandbox Code Playgroud) 我有一个Queueq1,我想创建一个Queue与Queueq1 相同的q2.如何做到这一点,因为Queue没有实现Cloneable.
In Effective Java, the author states that:
If a class implements Cloneable, Object's clone method returns a field-by-field copy of the object; otherwise it throws CloneNotSupportedException.
What I'd like to know is what he means with field-by-field copy. Does it mean that if the class has X bytes in memory, it will just copy that piece of memory? If yes, then can I assume all value types of the original class will be copied to the new object?
class Point …Run Code Online (Sandbox Code Playgroud) 我知道这clone()是一个受保护的方法,但"受保护"意味着它可以被特定类的所有子类访问.
任何Java类都是其子类Object,那么受保护方法的原因是什么?
为什么我们clone()只能调用实现Cloneable接口的类?我不明白它是如何连接到一个事实,clone()在Object为受保护声明.
所以,我一直在阅读设计模式,原型模式让我困惑.我相信使用它的一个要点是避免使用new运算符.然后我看看这个例子:
http://sourcemaking.com/design_patterns/prototype/java/1
首先,他们对Prototype的想法实现了一个clone()方法,这很奇怪.维基百科还说我需要一个纯子方法克隆来实现子类(为什么?).Java是否已经提供了这样的方法,正是我们需要它做的事情(这是创建一个对象的副本而不是从头开始实例化)?其次,clone方法调用new new!当然这个例子是错的?(在这种情况下,我应该在其他地方学习设计模式,嘿?).有人能说出这种纠正是否正确吗?:
static class Tom implements Cloneable implements Xyz {
public Xyz cloan() {
return Tom.clone(); //instead of new I use clone() from Interface Cloneable
}
public String toString() {
return "ttt";
}
}
Run Code Online (Sandbox Code Playgroud)
任何澄清表示赞赏.
Cloneable在Java中本质上是破碎的.具体来说,我对界面的最大问题是它需要一种不定义方法本身的方法行为.因此,如果遍历Cloneable列表,则必须使用反射来访问其定义的行为.但是,在Java 8中,我们现在有默认方法,现在我问为什么没有默认clone()方法Cloneable.
我理解为什么接口不能默认Object方法,但是,这是一个明确的设计决策,因此可以做出异常.
我有点想到弃用Object.clone()并将其内部代码更改为:
if(this instanceof Cloneable) {
return ((Cloneable) this).clone();
}
else {
throw new CloneNotSupportedException();
}
Run Code Online (Sandbox Code Playgroud)
并继续前进任何魔法使其clone()成为默认方法Cloneable.这并没有真正解决,clone()仍然可以很容易地错误地实现,但这本身就是另一个讨论.
据我所知,这种变化将完全向后兼容:
clone()但未实现的类Cloneable(为什么?!)在技术上仍然可以(即使在功能上不可能,但这与以前没有什么不同).clone()但实现的类Cloneable在其实现上仍将起相同的作用.clone(),但确实实现Cloneable(为什么?!)的类现在将遵循规范,即使它在功能上并不完全正确.Object.clone()仍然可以在功能上工作.super.clone()即使它正在引用,它在功能上仍然是相同的Object.clone().更不用说这将解决一个巨大的问题Cloneable.虽然繁琐且仍然容易错误地实现,但它将解决界面的巨大面向对象问题.
我能看到的唯一问题是那些实现Cloneable没有义务覆盖的问题clone(),但这与以前没有什么不同.
这已在内部进行过讨论,但从未取得成果吗?如果是这样,为什么?如果是因为接口不能默认使用Object方法,那么在这种情况下做出异常是否有意义,因为所有继承Cloneable的对象都是期待clone()的?
我试图克隆类Integer的对象,它实现了可克隆的接口.
Integer a = new Integer(4);
Integer b = a.clone();
Run Code Online (Sandbox Code Playgroud)
我知道有这方面的工作,但我必须像这样实现它.为什么我收到此错误=
clone()已保护访问权限java.lang.Object
为什么会这样说?clone方法不是clonable接口的公共抽象方法,它与object有什么关系.提前致谢 :-)
我一直在网上寻找关于java克隆的教程,但只发现了clone()的缺点,而没有找到优点.我想知道使用Java clone()的一些优点.
我试图理解java中clone()方法下面发生了什么,我想知道如何做一个新的调用
public class Person implements Cloneable {
private String firstName;
private int id;
private String lastName;
//constructors, getters and setters
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的克隆代码我想知道底下发生了什么,以及新呼叫之间有什么区别因为.
这是我的客户端代码
Person p = new Person("John", 1, "Doe");
Person p2 = null;
try {
p2 = (Person) p.clone();
} catch (CloneNotSupportedException ex) {
Logger.getLogger(clientPrototype.class.getName()).log(Level.SEVERE, null, ex);
}
p2.setFirstName("Jesus");
System.out.println(p);
System.out.println(p2);
Run Code Online (Sandbox Code Playgroud) cloneable ×10
java ×10
clone ×5
heap ×1
java-8 ×1
memory ×1
object ×1
performance ×1
queue ×1
serializable ×1