clone和用new创建对象的代价有什么不同?怎么产生的代价?

使用原型模式的其中一个原因就是多次new对象的代价远大于clone生成多个对象的代价
谁能帮我解释下clone和new的操作代价具体是怎么产生的?

帮你搜了一下,以下答案看是否满意:

1、new
  使用java的关键字new来创建对象实例。构造函数链中的所有构造函数都会被自动调用。
Java代码:
   CreateInstance instance = new CreateInstance ();
2、clone
构造函数不被自动调用。
  
Java代码:
   public class CreateInstance implements Cloneable{
    public CreateInstance getInstance() throws CloneNotSupportedException{
     return (CreateInstance) this.clone();
}

}
  如果需要复制上面的那个obj指向的对象实例时,调用new CreateInstance().getInstance()方法就ok了。
JDK中Object# clone()方法的原型是:protected native Object clone() throws  CloneNotSupportedException; 方法修饰符是protected,而不是public。
这种访问的不可见性使得对Object#clone()方法不可见。所以,必需重写Object的clone方法后才能使用。
Java代码:
   public class CreateInstance implements Cloneable{
    public CreateInstance clone throws CloneNotSupportedException{
     return (CreateInstance) super.clone();
}

}
值得注意的是 :如果需要使用clone方法,必需实现java.lang.Cloneable接口,否则会抛出java.lang.CloneNotSupportedException。
另外clone方法所做的的操作是直接复制字段的内容,换句话说,这个操作并不管该字段对应的对象实例内容。
像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝"。
3、newInstance
利用java.lang.Class类的newInstance方法,则可根据Class对象的实例,建立该Class所表示的类的对象实例。
创建CreateInstace类的对象实例可以使用下面的语句(这样需要一个已经存在的对象实例)。

CreateInstance instance = CreateInstance.class.newInstance();

或者使用下面的语句(只需要存在相应的.class文件即可)

CreateInstance instance = (CreateInstance)Class.forname("com.create.instance.CreateInstance").newInstance();

如果包下不存在相应.class文件,则会抛出ClassNotFoundException。
注意 :newInstance创建对象实例的时候会调用无参的构造函数,所以必需确保类中有无参数的构造函数,否则将会抛出java.lang.InstantiationException异常。
无法进行实例化。
温馨提示:内容为网友见解,仅供参考
无其他回答

clone和用new创建对象的代价有什么不同?怎么产生的代价?
像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝"。3、newInstance 利用java.lang.Class类的newInstance方法,则可根据Class对象的实例,建立该Class所表示的类的对象实例。创建CreateInstace类的对象实例可以使用下面的语句(这样需要一个已经存在的对象实例)。...

深拷贝、浅拷贝和clone、new方法效率对比
public?class?CloneTest?{???public?static?void?main(String[]?args)?throws?CloneNotSupportedException?{???testShallowCopy();???}???public?static?void?testShallowCopy()?throws?CloneNotSupportedException?{???Address?address=?new?Address();???address.setName("北京天安门");???CustomerUser?custome...

你应该知道的Java创建对象的四种方式
首先,使用new运算符创建对象是最直接的方式。例如,创建一个表示宠物的类Dog,通过new Dog("小黑", 3)语句,我们可以实例化出一个名为"小黑",年龄为3岁的Dog对象。其次,Java的反射技术允许在运行时获取类的信息并操作对象。通过反射可以创建对象并访问其属性和方法。获取类对象后,调用newInstance()...

关于克隆人的资料
主要观点:克隆人具有自然人的法律主体资格 克隆人给社会带来法律主体上的混乱 克隆人研究行为是违法行为 克隆人研究者涉嫌故意杀人及伤害罪 克隆人的受监护权被抚养权得不到保护 克隆人的生命健康权和人格权结婚权得不到保护 克隆人研究是对于进一步犯罪的引诱 克隆人的研究违背人类不变的伦理道德并且也是人类的陷阱 ...

Java 创建对象的四种方法
一、使用new方式创建对象是Java中最基本也是最常用的方法。通过new操作符,我们可以直接实例化一个类,从而创建出一个新对象。二、使用反射机制创建对象可以让我们在运行时动态地获取类信息,生成对象。这种灵活性在某些特定场景下非常有用,如动态加载类或对象。四、序列化创建对象是将对象的状态信息转换为...

java如何克隆对象
clone()方法在创建对象精确副本时节省了额外的处理工作。如果仅使用new关键字创建对象,这将需要执行大量的时间,因此对象克隆技术用于提高效率。在Java中,使用clone()方法的步骤如下:1)创建一个要克隆的对象实例;2)调用clone()方法获取对象的副本;3)利用副本执行所需的操作。这样,我们无需复制原始...

ArrayList的clone方法是浅表复制,clone的结果却是复制了对象?
比如:A 包括一个B对象,那么浅表复制相当于:clone (){ a = new A () ;a.B = this.B } 而深层复制就是:clone (){ a = new A () ;a.B = this.B.clone () ;} 也就是说:复制B的引用还是创建新的B的实例的问题。你用字符串不好说明。如果换成object,你看他的输出结果就是...

通常情况下,原型法会单独使用吗?
一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与Java融为浑然一体,大家可以随手拿来使用。原型模式,是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。当直接创建对象的代价比较大时,...

JAVA创建对象有哪几种方式?
1.用new语句创建对象,这是最常见的创建对象的方法。2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。3.调用对象的clone()方法。4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。第一种最常见 ...

在类中创建对象和在方法中创建对象,这两种有什么区别?
我理解的是在类中创建的对象,相当于全局的,使用面积更广,并且是要用static静态进行修饰的,随着类的加载而加载,在本项目中的其他类也是可以引用的...在方法中创建的对象,就是相当于成员变量的感觉,使用面积就有些局限性了,而且在本项目的其他类是不能够引用的...我想的大概就这么多......

相似回答