1、Cloneable接口只是个标记接口,里面没有任何实现方法,不实现Cloneable接口也可以使用Object的clone方法
2、任何类都是Object的子类,在子类里当然可以直接调用clone方法,比如super.clone()
3、注意clone方法用native修饰,表明该方法有方法体只是调用的jre外部方法,一般是用C语言实现,其作用是通过jvm和操作系统底层交互
4、参照3
‘贰’ java怎么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()方法。
‘叁’ java的clone方法
1.Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态得找到目前正在调用clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达到shallow的目的。
所以你调用super.clone() 得到的是当前调用类的副本,而不是父类的副本。
2.这句话是J2SE API帮助里面的话,意思是要让实例调用clone方法就需要让此类实现Cloneable接口,API里面还有句话是:如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常,这便是“合法”的含义。 但请注意,Cloneable接口只是个标签接口,不含任何需要实现的方法,就像Serializable接口一样。
3. Object.clone()? 不能这么调用的。
回答还满意么。
/*------------------以下是对问题的补充---悲哀的注释------------*/
ok 请容我慢慢道来
你看到clone()是Object的方法,而Object是所有类的父类,就认为可以用Object调用 clone是么?
但不能使用Object调用clone()方法
原因如下:
1.从你写法本身来看,Object.clone()肯定不行,因为Object是类, 而clone()是成员方法,所以不能用Object.clone();
2.那么是不是可以先Object obj=new Object();再obj.clone();或者Object.class.newInstance().clone()呢?还是不行。
clone()对Object类对象本身是不可见的。所以你会发现找不到clone()方法
原因是:clone()方法是protected访问权限
方法原型:protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException
而protected权限的含义是:只对同一包中的类和不同包中的子类及间接子类可访问,换句话说就是不同包中的非子类或间接子类不能访问,包含了默认的包访问权限。
这个地方容易混淆哦
你可能会问任何类都是Object的子类为什么不能访问呢,对,任何类是他的子类也继承了clone()方法
但请注意,你那句代码clone()的调用者是谁?是Object本身,即Object对象,正如我们所说,“不同包中的非子类或间接子类不能访问”,这里面也包括了父类本身,你调用者是父类,在不同包中,protected成员对父类不可见哦,所以根本不能用object对象调用clone()
综上,因为在不同包中父类本身不能调用,也找不到protected方法 ,故无法在代码中使用object直接调用clone()方法,
有点难理解,关键在对protected的理解上,因为protected除了本身在继承上的访问权限外,还包含了包访问权限,希望回答你还满意。
‘肆’ java clone方法 怎么用
什么是"clone"?
在实际编程过程中,我们常常要遇到这种情况:
有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。
Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。
要说明的有两点:
一是拷贝对象返回的是一个新对象,而不是一个引用。
二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
怎样应用clone()方法?
一个很典型的调用clone()代码如下:
{
publicintaInt;
publicObjectclone(){
CloneClasso=null;
try{
o=(CloneClass)super.clone();
}catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returno;
}
}
有三个值得注意的地方,
一是希望能实现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 代码实现对象的拷贝
package com.teven.comefromnet;
/**
* Name:C.java
* Founction:
* Created:2011-9-15
* @author :teven
*/
public class CloneTest {
static class A implements Cloneable{
int i=1;
@Override
protected A clone() throws CloneNotSupportedException {
return (A)super.clone();
}
}
static class B extends A{
int j=2;
@Override
protected B clone() throws CloneNotSupportedException {
return (B)super.clone();
}
}
static class C extends B{
int k=3;
@Override
protected C clone() throws CloneNotSupportedException {
return (C)super.clone();
}
}
public static void main(String[] args) throws CloneNotSupportedException {
A a = new CloneTest.A();
A aa = (A) a.clone();
System.out.println("before clone a.i = "+ a.i+">> after clone aa.i=" +aa.i);
B b = new CloneTest.B();
B bb= (B) b.clone();
System.out.println("before clone b.j = "+ b.j+">> after clone bb.j=" +bb.j);
C c = new CloneTest.C();
C cc= (C) c.clone();
System.out.println("before clone c.k = "+ c.k+">> after clone cc.k=" +cc.k);
}
}
‘陆’ java clone方法
可以用this啊,应为你调用this.clone是调用的当前类的clone方法,所以你在调用object的clone时就要写super了,你把你employee的clone方法名换个别的名字
public Employee cloneDemo() throws CloneNotSupportedException
{
return (Employee)this.clone();
}
就可以了
‘柒’ java clone()方法
虽然clone是Object就有的方法,但是想用必须实现Cloneable接口,String没有实现这个接口
所以这么提示,The method clone() from the type Object is not visible
从Object继承过来的clone方法不可见
‘捌’ java clone()
这是Object对象的clone克隆/复制方法作用是执行后将复制一份当前对象,并返回。
使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常
所以 Employee必须 implements Cloneable
又由于clone方法是Object就具有的,所以可以直接返回return (Employee)this.clone();
‘玖’ java代码 clone()函数的作用是什么
从楼主对回答的追问上发现,楼主的连JAVA基本的语法都很差啊。=号是赋值运算符,不是比较。
double[] vectorValue;
vectorValue = vectorValue.clone();
这个段代码执行肯定报错了。但他还的意思还是很明确的。
首先:double[] vectorValue; 这个是定义了一个double类型的数组变量vectorValue。
其次:vectorValue = vectorValue.clone(); //这个是将vectorValue 克隆一份,赋值给自己。也就是说vectorValue变量指向了新的一块内存区域。
举个例子可能更能说明问题。
{
privateinti;
publicTestMain(inti){
this.i=i;
}
@Override
protectedObjectclone(){
//TODOAuto-generatedmethodstub
returnnewTestMain(this.getI()+1);
}
publicintgetI(){
returni;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TestMaintm1=newTestMain(1);
TestMaintm2=tm1;
tm1=(TestMain)tm1.clone();
System.out.println(tm1.getI());//tm1指向的是通过clone()方法创建的新的对象的地址,i的值已经是2了。
System.out.println(tm2.getI());//tm2指向的还是tm1创建时的地址,i的值为1
}
}
‘拾’ 在哪里可以看到JAVA的object类中clone方法的源代码
看不到的,是C代码。听说Java开源了,你倒是可以去官网上看看。
调用中实现clonable接口并给出方法。
public class Example implements Clonable {
int valueToClone;
public Object clone() {
Object o = super.clone();
(Example) o).valueToClone = valueToClone;
return o;
}
}
另外参见API. 有的书建议不采用Clonable,因为非常难实现一个完美的Clone 链,且方法本身返回Object需要cast,并不美观。可以自己写一个接口代替。