「java对象clone」java对象clon工具类
本篇文章给大家谈谈java对象clone,以及java对象clon工具类对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Java中clone方法的疑问
- 2、Java中Object.clone方法的用途是什么?
- 3、java clone 怎么调用
- 4、在java中 clone为什么要用super.clone()方法?
Java中clone方法的疑问
因为在java.lang.Object类的定义里,clone()这个方法是protected,
按照protected的访问控制范围规定,只能是当前类,或当前包,或其他包的子类,这三种情况能访问。
注意这里的”能访问“都是通过原有对象访问的。
你可能以为你代码里obj满足”其他包的子类“这个条件,错了,一旦new出来,就脱离了作用域了。而super仍是原有对象,因此可以访问父类Base乃至Object的保护的clone()方法。
Java中Object.clone方法的用途是什么?
clone方法是用来复制一个对象。不同于“=”。
对于值类型的数据是可以通过“=”来实现复制的。但是对于引用类型的对象,“=”只能复制其内存地址,使对象的引用指向同一个对象,而不会创建新的对象。clone则可以创建与原来对象相同的对象。举个例子:
有一个Car类
Car c1 = new Car();
Car c2 = c1;
这两句事实上只创建了一个对象。只不过c1和c2指向了同一个对象。
如果上面的两句改为:
Car c1 = new Car();
Car c2 = c1.clone();
那么就有了两个对象,而且这两个对象的内容是一样的。(所有的属性值相同)
同时,我想说的是一楼的使用,虽然程序本身没有错误,但是用date.clone()添加到list当中,会再次创建date的对象,消耗内存资源,这是编程的忌讳。特别是编写java程序,更要好好利用内存的有限资源,避免浪费。
java clone 怎么调用
Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子:
public class A {
public String name;
}
public class testClone {
public void changeA(A a){
a.name="b";
}
public void changInt(int i){
i=i*2+100;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
testClone test=new testClone();
A a=new A();
a.name="a";
System.out.println("before change : a.name="+a.name);
test.changeA(a);
System.out.println("after change : a.name="+a.name);
int i=1;
System.out.println("before change : i="+i);
test.changInt(i);
System.out.println("after change : i="+i);
}
}
在java中 clone为什么要用super.clone()方法?
1.Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态得找到目前正在调用clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达到shallowcopy的目的。 \x0d\x0a 所以你调用super.clone() 得到的是当前调用类的副本,而不是父类的副本。根本没有必用调用this.clone();\x0d\x0a2.要让实例调用clone方法就需要让此类实现Cloneable接口,API里面还有句话是:如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常,这便是“合法”的含义。 但请注意,Cloneable接口只是个标签接口,不含任何需要实现的方法,就像Serializable接口一样。\x0d\x0a\x0d\x0a总之,一般如果你的子类没有特殊需要而重写clone()方法就直接用super.clone() 就行了。
关于java对象clone和java对象clon工具类的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-23,除非注明,否则均为
原创文章,转载请注明出处。