导航:首页 > 编程语言 > java子类克隆

java子类克隆

发布时间:2022-09-28 15:00:38

java中任何类都可以看作是object类的子类,那么自己定义的类能直接调用object类的clone()方法吗

并不能,
在Object中clone是一个 protected native 的方法
要调用Object的clone方法,必须实现Clonable接口,在运行时,jvm会做检测,如果没有实现Clonable接口,就会抛出CloneNotSupportedException异常。
如果在类的内部调用clone方法,可以直接调用父类的clone方法
要在外部调用它,必须定义一个public的方法,然后调用它的父类的clone方法

Ⅱ 如何Java复制父类对象的数据到子类对象中

可以做到。首先数组的定义就是一组相同数据类型的集合,而继承父类的子类作为一种引用数据类型,他造出的对象也是可以保存在数组当中的。但是基本上没人会这样做,但实现我认为是能够的,你想想,String作为一种引用数据类型,他造出的字符串都可以保存在数组中,子类为什么不能呢?
-

Ⅲ 如何克隆Java对象

Java中的对象涉及使用引用类型,没有直接的方法可将一个对象的内容复制到一个新对象中。将一个引用分配给另一个引用只会给相同对象建立另一个引用。因此,Java对所有引用类型使用一个特殊的clone()方法,为对象复制自身提供一个标准的机制。以下是你需要了解和克隆Java对象有关的细节。为何建立一个本地拷贝?给一个对象建立本地拷贝的原因很可能是由于你计划修改该对象,并且你不想修改方法调用者的对象。如果你确定你需要一个本地拷贝,你可以使用Object类的clone()方法来执行这项操作。clone()方法被定义为受保护方法,但你必须在你希望克隆的所有子类中重新公开定义它。例如,标准库类ArrayList忽略clone(),但你可以这样为ArrayList调用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1’s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一个Object,它必须重新转变为适当的类型。这个例子说明ArrayList的clone()方法如何不能自动克隆ArrayList包含的每一个对象?原有ArrayList和克隆后的ArrayList是相同对象的别名。这种情况通常叫做浅拷贝,因为它仅仅复制一个对象的“表面”部分。实际的对象由这个“表面”,引用指向的所有对象,以及那些对象指向的所有对象等构成。这往往被称作“对象网络”。下一页>>

Ⅳ Java 中 如果clone为什么必须实现Cloneable接口

因为如果不继承自Cloneable接口,当调用clone()时会抛出CloneNotSupportedException异常

以下是详细讲解:

Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
怎样应用clone()方法?
一个很典型的调用clone()代码如下:
class CloneClass implements Cloneable{
public int aInt;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}

有三个值得注意的地方,一是希望能实现clone功能的CloneClass类实现了Cloneable接口,这个接口属于java.lang 包,java.lang包已经被缺省的导入类中,所以不需要写成java.lang.Cloneable。另一个值得请注意的是重载了clone()方 法。最后在clone()方法中调用了super.clone(),这也意味着无论clone类的继承结构是什么样的,super.clone()直接或 间接调用了java.lang.Object类的clone()方法。下面再详细的解释一下这几点。

应该说第三点是最重要的,仔细 观察一下Object类的clone()一个native方法,native方法的效率一般来说都是远高于java中的非native方法。这也解释了为 什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息赋到新对象中,虽然这也实现了clone功能。对于第二点,也要 观察Object类中的clone()还是一个protected属性的方法。这也意味着如果要应用clone()方法,必须继承Object类,在 Java中所有的类是缺省继承Object类的,也就不用关心这点了。然后重载clone()方法。还有一点要考虑的是为了让其它类能调用这个clone 类的clone()方法,重载之后要把clone()方法的属性设置为public。

那么clone类为什么还要实现 Cloneable接口呢?稍微注意一下,Cloneable接口是不包含任何方法的!其实这个接口仅仅是一个标志,而且这个标志也仅仅是针对 Object类中clone()方法的,如果clone类没有实现Cloneable接口,并调用了Object的clone()方法(也就是调用了 super.Clone()方法),那么Object的clone()方法就会抛出CloneNotSupportedException异常。

Ⅳ 在java中,如何复制一个对象比如说string对象

可以使用clone来实现,clone用于为引用类型的复制
1.使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
按照惯例,返回的对象应该通过调用 super.clone 获得。

详见关于clone的API文档

Ⅵ java 的克隆为什么会抛出 CloneNotSupportedException异常

Object声明的protected clone虽然可以阻止实现clone()的子类,在子类外部直接调用clone(),但是对静态方法却没有办法,因为静态方法可以直接访问protected的方法,而这样就有可能会出现对对象使用clone(),而实际对象不支持clone(),所以此时就会抛出这个异常。

Ⅶ Java中对对象克隆,一定要实现Cloneable接口吗

是的。如果没有实现Cloneable接口,则调用Object的clone方法克隆对象将会抛出下面这个错误:
CloneNotSupportedException
- 如果对象的类不支持 Cloneable 接口,则重写 clone
方法的子类也会抛出此异常,以指示无法复制某个实例。更多java技术请访问bug315。

这是Object中clone方法的定义:
protected Object clone() throws CloneNotSupportedException

Ⅷ java中对象的克隆疑问

Object o1=new Object();
System.out.println(o1.hasCode());//打印o1的内存地址。
Object o2=new Object();
System.out.println(o2.hasCode());//打印o2的内存地址。
可见o1和o2拥有不同的内存数据,如果你让o2=o1,那o1和o2的地址就一样了,就是一个对象了,怎么还叫克隆?
老祖宗Object类的clone方法是将一个对象的数据原封不动的复制到另一个对象中去,比如o2=o1.clone();就将o1的数据复制了一份考贝到了另一块内存中,所以o2与o1地址不一样但数据相同。
你这里的super.clone();就是调用的Object类的clone()方法,调用Object的方法不就是省得你自己写了吗。
你可能还会问Object既然有clone()方法,而所有的类都是Object类的子类,那所有的类不都有clone()方法吗,干什么还自己写?Object类虽然有clone()方法,但是访问控制符是protected而不是public,于是别的类不可见,所以你需要重写它:

@Override
public Object clone(){
Object obj=null;
try {
obj= super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
而且你需要将你的类实现cloneable接口,这是必须的。

Ⅸ java里关于克隆的问题,所有类都是Object的子类何必在复写clone方法

深度克隆的问题,如果类中成员包含集合类,如list等,或者包含map的,默认的clone方法为浅克隆,不会复制集合中的元素。如果复写clone方法,则可根据需求来复制成员。

Ⅹ java对象之间如何实现克隆(复制)

用clone()方法,不过在对象重载了Object的clone才能用。Object的clone方法是protected。

阅读全文

与java子类克隆相关的资料

热点内容
rtl8192elinux 浏览:15
手机中qq群怎么改名字怎么改 浏览:621
微信小视频怎么用前置摄像头吗 浏览:572
c语言怎么用编程测标识符的合法性 浏览:815
iphone5s驱动下载 浏览:336
欣向路由器密码 浏览:850
sql数据库对比工具 浏览:575
300ap升级 浏览:981
为什么从邮箱里下载文件会不全 浏览:913
java大数据乘整数 浏览:136
cad打开文本txt文件 浏览:472
征途账号存在哪些文件 浏览:412
天气肇庆市路况工具 浏览:950
怎么导入js文件怎么打开 浏览:517
win8和linux双系统安装 浏览:328
苹果5按屏幕有紫色 浏览:272
qq已失效的文件怎么找回 浏览:63
步步高s7系统升级 浏览:179
win10双启动菜单 浏览:749
广州塔如何编程 浏览:817

友情链接