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

qqxxcc123 2014-07-03 11:21:05
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的垃圾回收有关系?
...全文
371 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_17240387 2014-07-04
  • 打赏
  • 举报
回复
hedley 2014-07-03
  • 打赏
  • 举报
回复
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.
chengxu2011 2014-07-03
  • 打赏
  • 举报
回复
Object类没有实现Cloneable接口 当然不能克隆 java中的类只要实现了Cloneable接口就能克隆
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 1 楼 chengxu2011 的回复:
Cloneable是一个标识性接口 实现了这个接口等于告诉了虚拟机我可以被克隆 ,如果没有实现是不可以被克隆的 标识行接口还有 Serializable 接口 lz可以百度下java标识性接口
还有,Java中的类都不能被clone么?
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 1 楼 chengxu2011 的回复:
Cloneable是一个标识性接口 实现了这个接口等于告诉了虚拟机我可以被克隆 ,如果没有实现是不可以被克隆的 标识行接口还有 Serializable 接口 lz可以百度下java标识性接口
恩 好的 那Object类为什么不能clone呢?比如

Object o = new Object();
Object o2 = o.clone();
chengxu2011 2014-07-03
  • 打赏
  • 举报
回复
Cloneable是一个标识性接口 实现了这个接口等于告诉了虚拟机我可以被克隆 ,如果没有实现是不可以被克隆的 标识行接口还有 Serializable 接口 lz可以百度下java标识性接口
业余草 2014-07-03
  • 打赏
  • 举报
回复
什么是水区??????求解
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 15 楼 longtian1213 的回复:
引用 14 楼 u012335961 的回复:
- - 子类重新父类的方法,可以增强可见性,不能减弱 如果反过来,父类是public,你不能重写成protected
不好意思 突然脑子一抽搞反了
S117 2014-07-03
  • 打赏
  • 举报
回复
引用 12 楼 qqxxcc123 的回复:
引用 11 楼 longtian1213 的回复:
克隆是object类的方法,你实现Cloneable只是告诉虚拟机这个类可以被克隆,你不实现Cloneable借口调用clone方法会报错吧
恩 不实现会报错 我的问题是自己重写了Object中的clone方法 额 貌似又不是重写 因为Object中的clone方法是protected的。但是为什么我写成public没报错?
重写只要不降低访问权限就没问题!如果你变成private的就不行了!
hedley 2014-07-03
  • 打赏
  • 举报
回复
- - 子类重新父类的方法,可以增强可见性,不能减弱 如果反过来,父类是public,你不能重写成protected
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
技术区人好少啊
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 11 楼 longtian1213 的回复:
克隆是object类的方法,你实现Cloneable只是告诉虚拟机这个类可以被克隆,你不实现Cloneable借口调用clone方法会报错吧
恩 不实现会报错 我的问题是自己重写了Object中的clone方法 额 貌似又不是重写 因为Object中的clone方法是protected的。但是为什么我写成public没报错?
S117 2014-07-03
  • 打赏
  • 举报
回复
克隆是object类的方法,你实现Cloneable只是告诉虚拟机这个类可以被克隆,你不实现Cloneable借口调用clone方法会报错吧
hedley 2014-07-03
  • 打赏
  • 举报
回复
地址那个大概说个意思吧 大家都知道java new一个对象都是放在堆内存上的,Object分配内存地址的算法是JVM内部实现的,直接print一个对象出来可以去看Object的toString方法,
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
hashCode方法返回了这个内存地址的一个标记,然后转换为16进制打印。 native的hashCode方法屏蔽了这些实现的细节,但我们可以设想在同样的计算机环境Context下,这个分配的内存地址应该是相对稳定的(因为特定算法封装的嘛),所以你在重复的操作中,可以认为计算机的环境是相对稳定的,从而可以得到一个相对稳定的结果。 偶尔这个地址有变化很正常啊,谁知道你电脑里跑了多少线程,在哪个时间点污染了这个Context
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 8 楼 xmt1139057136 的回复:
我没分了,求给分
水区要分去
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 4 楼 chengxu2011 的回复:
Object类没有实现Cloneable接口 当然不能克隆 java中的类只要实现了Cloneable接口就能克隆
那地址那个问题能给解答下么
qqxxcc123 2014-07-03
  • 打赏
  • 举报
回复
引用 5 楼 u012335961 的回复:
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.
给跪了 你好流弊啊

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧