新手上路 问个Object类 clone() 的问题

impulsecdq 2008-04-26 09:27:43
查看文档 clone()方法是 protected型的
代码
class Parent implements Cloneable{
Parent(int i){
par = i;
}
int par;

public static void main(String[] args){
Parent p = new Parent(1);
Parent clnP = null;
try{
clnP = (Parent)p.clone();
}
catch(CloneNotSupportedException cloneError){
System.out.println(cloneError.toString());
}
if(clnP != null)
clnP.par = 2;
System.out.println(p.par);
}
}
编译通过 即使改变的拷贝对象clnP中的字段 原对象不变
但是 如果我把main()函数些在其他类里面比如class MainTest
则不可以 那是因为protected 类型在非同包+无继承关系的原因吗
如果我用
class SOn extends Parent{
Son(int i){
super(i);
}
public static void main(String[] a){
Parent s = new Son(1);
Parent clnS = null;
try{
clnS = (Son)s.clone();
}
catch(CloneNotSupportedException cloneError){
System.out.println(cloneError.toString());
}
if(clnS != null)
clnS.par = 2;
System.out.println(clnS.par);
}
编译也不能通过 错误同上 clone() 可以在java.lang.Object中访问protected

请高手指教 谢谢了
...全文
168 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmsuccess 2008-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 impulsecdq 的回复:]
看到一句话 不知道正确否 Object <-Parent 如果我在另外一个类MainTest中实例化Parent类 那么Object中的那个protected 方法在MainTest中会退化为private 是这样吗 请指点 谢谢
[/Quote]
我让Parent 继承一个有protected的方法,在SOn应用是可以的,你说的是不是这个意思
impulsecdq 2008-04-27
  • 打赏
  • 举报
回复
恩, 比如Parent有个protected方法,Son继承Parent,既然是protected的,那么同一个包以及他的子类都可以调用到这个方法,现在的问题是,Object是在java.lang包中的,而Parent和Son是在default包中的,那么,Parent继承Object,这个方法仍然是可以调用到的吧,但是如果是一个其他的类比如是MainTest,虽然他也继承了Object,但是他是访问不到另外一个继承了Object类的Parent中的这个骗人哦特长特点方法的,因为Parent和MainTest没有继承关系,但是如果Son继承了Parent,这个方法能调用到吗? 试验了下好像不能,请指教
hmsuccess 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 impulsecdq 的回复:]
为什么不是 仔细看代码 首先sheepfold1设置成第一个羊圈 sheep1设置成第一只羊 然后是sheepfold2设置成sheepfold1的一份拷贝 然后去修改这份拷贝的字段 而他只设置了该拷贝的sheepfold2.name为第一个羊圈的拷贝 忘记去设置sheepfold2.sheep了 显然 现在拷贝指向的sheep的引用还是sheepfold1中的sheep 显示就有问题 在main()中加入
java code
Sheep sheep2 = new Sheep();
sheep2.setName("第一只羊的克隆…
[/Quote]
不解
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
为什么不是 仔细看代码 首先sheepfold1设置成第一个羊圈 sheep1设置成第一只羊 然后是sheepfold2设置成sheepfold1的一份拷贝 然后去修改这份拷贝的字段 而他只设置了该拷贝的sheepfold2.name为第一个羊圈的拷贝 忘记去设置sheepfold2.sheep了 显然 现在拷贝指向的sheep的引用还是sheepfold1中的sheep 显示就有问题 在main()中加入
java code
Sheep sheep2 = new Sheep();
sheep2.setName("第一只羊的克隆");
sheepfold2.setSheep(sheep2);
即可
yaray 2008-04-26
  • 打赏
  • 举报
回复
注意,8楼提供的链接中的'深克隆'仍然是浅克隆.
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
恩 那个链接也看了 是深度拷贝的例子 不过其实我问的和深拷贝是不一样的 是问访问类型的问题
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
是的 是浅拷贝 6楼的朋友说的对 我知道 我想要知道的是 Object中protected类型 应该可以在他的子类Parent中访问到吧 所以把main()函数也写在Parent中 得到的结果就是 我可以克隆一份拷贝 而且修改拷贝不影响本身 但是如果我再继承Parent成他的子类Son 并且把main()函数写在Son中 那么我此时就访问不到Object中的clone()方法了 这是为什么呢?

(其实一开始也就对By convention, classes that implement this interface should override Object.clone (which is protected) with a public method. See Object.clone() for details on overriding this method. 这句话好奇 但是由于水平实在有限 不能体会到这样做的目的
后来发现了这个问题)
hmsuccess 2008-04-26
  • 打赏
  • 举报
回复
http://www.java2000.net/viewthread.jsp?tid=1235#T3435
yaray 2008-04-26
  • 打赏
  • 举报
回复
注意,这样克隆出来的对象 是 浅克隆对象。
anqini 2008-04-26
  • 打赏
  • 举报
回复

package zhao;

public class Parent implements Cloneable{
Parent(int i){
par = i;
}
int par;

public static void main(String[] args){

Parent p = new Parent(1);
Parent clnP = null;
try{
clnP = (Parent)p.clone();
System.out.println();
}
catch(CloneNotSupportedException cloneError){
System.out.println(cloneError.toString());
}
if(clnP != null)
clnP.par = 2; //clnP的par为2!
System.out.println(p.par); //但p的par还是1,因为clnP和p指的不是同一个内存地址块
}
public Object clone() throws CloneNotSupportedException {//要重写,因为clone方法是protected的,所以你在这个parent类里必须重写!

return super.clone();
}
}
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
看到一句话 不知道正确否 Object<-Parent 如果我在另外一个类MainTest中实例化Parent类 那么Object中的那个protected 方法在MainTest中会退化为private 是这样吗 请指点 谢谢
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
是的 我也看到了 他要我重写成 public的 我只是想知道既然不继承其他类的类就是从Object继承过来的 那么 我应该就可以在子类中访问到protected的方法的 而在同一个类中确实也是可以的 但是 如果我继续从Parent继承下来 到Son为什么就无法访问到了呢 Object<-Parent<-Son
cl55 2008-04-26
  • 打赏
  • 举报
回复
By convention, classes that implement this interface should override Object.clone (which is protected) with a public method. See Object.clone() for details on overriding this method.
cl55 2008-04-26
  • 打赏
  • 举报
回复
class Parent implements Cloneable{
Parent(int i){
par = i;
}


你这样是不对的,clone方法应该你自己提供。 用一个public 的去override 那个protected的。
impulsecdq 2008-04-26
  • 打赏
  • 举报
回复
抱歉
class Son类中 SOn 改成Son
最后一行 clnS 改成 s

62,623

社区成员

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

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