当前位置: 代码迷 >> J2SE >> 关于Clone的有关问题,小白求解答
  详细解决方案

关于Clone的有关问题,小白求解答

热度:78   发布时间:2016-04-23 20:34:24.0
关于Clone的问题,小白求解答
1. Cloneable这个接口里面什么方法也没有啊?那我不实现Cloneable这个接口,直接写clone方法:
public class A {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Object clone() {
A o = null;
try {
o = (A) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}

然后在main中这样:
A a1 = new A();
A a2 = new A();
a1.setName("a1");
a2 = (A) a1.clone();
System.out.println(a1);
System.out.println(a2);
a2.setName("a2");
System.out.println("a1 name: " + a1.getName());
System.out.println("a2 name: " + a2.getName());

为什么会抛异常?a2是null,为什么A类实现了Cloneable接口后就好了?
2.Object 为什么不能调clone()方法?
3.这个和clone()无关,我在跑方法的时候发现了一个问题,就上面的方法,为什么a1的地址几乎一直是A@c17164,偶尔这个地址会变,但90%都是A@c17164。不是new了么?为什么还是这个地址?是否和java的垃圾回收有关系?
------解决方案--------------------
Cloneable是一个标识性接口 实现了这个接口等于告诉了虚拟机我可以被克隆 ,如果没有实现是不可以被克隆的 标识行接口还有
Serializable  接口 lz可以百度下java标识性接口
------解决方案--------------------
Object类没有实现Cloneable接口 当然不能克隆 java中的类只要实现了Cloneable接口就能克隆
------解决方案--------------------
Effective Java,Item 11(第二版,54页)中专门说的这个问题
这是java中最反人类的设计,可能没有之一。具体的细节楼主可以去翻阅一下,给你贴出来最后的结论

Given all of the problems associated with Cloneable, it’s safe to say that
other interfaces should not extend it, and that classes designed for inheritance
(Item 17) should not implement it. Because of its many shortcomings, some
expert programmers simply choose never to override the clone method and never
to invoke it except, perhaps, to copy arrays. If you design a class for inheritance,
be aware that if you choose not to provide a well-behaved protected clone
method, it will be impossible for subclasses to implement Cloneable.

------解决方案--------------------
地址那个大概说个意思吧 
大家都知道java new一个对象都是放在堆内存上的,Object分配内存地址的算法是JVM内部实现的,直接print一个对象出来可以去看Object的toString方法,
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }


hashCode方法返回了这个内存地址的一个标记,然后转换为16进制打印。
native的hashCode方法屏蔽了这些实现的细节,但我们可以设想在同样的计算机环境Context下,这个分配的内存地址应该是相对稳定的(因为特定算法封装的嘛),所以你在重复的操作中,可以认为计算机的环境是相对稳定的,从而可以得到一个相对稳定的结果。
偶尔这个地址有变化很正常啊,谁知道你电脑里跑了多少线程,在哪个时间点污染了这个Context
------解决方案--------------------
克隆是object类的方法,你实现Cloneable只是告诉虚拟机这个类可以被克隆,你不实现Cloneable借口调用clone方法会报错吧
------解决方案--------------------
- -
子类重新父类的方法,可以增强可见性,不能减弱

如果反过来,父类是public,你不能重写成protected
  相关解决方案