日期:2014-05-20  浏览次数:20771 次

JAVA中 clone()方法的使用
Object类中定义了clone()方法。该方法可以对引用类型,如数组进行克隆。举例:
public static void main(String args[]){
  int a[]=new int[5];
  int b[]=new int[6];
  Arrays.fill(b,1);
  a=b.clone();
  System.out.println(Arrays.toString(a));
}
输出结果是: 1 1 1 1 1 1
克隆不仅是拷贝内容,还会把结构也给改掉?声明的数组a 只有5个内存空间,将b克隆赋给a后 b的数组大小也变为6了。这样数组的结构可以随意更改,感觉有些不安全...所以想到了常量数组,就测试了以下代码:
  final int a[] = new int[5];
  int b[]=new int[6];
  Arrays.fill(b,1);
  a=b.clone();
  System.out.println(Arrays.toString(a));
输出结果一样。
想问一下为什么。是不是final关键字声明部分有问题,如果是 应该怎么改。

  
Java

------解决方案--------------------
看API:
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 



当Class A成员变量类型是java的基本类型时(外加String类型),只要实现如上简单的clone(称影子clone)就可以。但是如果Class A成员变量是数组或复杂类型时,就必须实现深度clone。
------解决方案--------------------
简单的说,a指向了另一个新对象,而不是int[5]了
我想类似这样:
int a = 1;
int a = 2;
最后输出结果为2,因为a是变量可以重复赋值,所以此时a的新值是对b数组克隆后的结果,6个1是理所当然的
至于final后的情况,如2楼所说,编译错误,被final标记的,不能重复赋值
希望对你有帮助