clone问题!

gggosling 2004-09-04 07:23:03
一个员工类Employee
class Test
{
public static void main(String[] args)
{
Employee worker=new Employee("tom",50000);
worker.setHireday(2000,1,1);
Employee copy=(Employee)work.clone();
...
}
}
class Employee implements cloneable
{
public Employee(String n,double s)
{
...

}

public Object clone()
{
try
{
Employee cloned=(Employee)super.clone();
cloned.hireDay=(Date)hireDay.clone();
return cloned;

}
catch(cloneNotSupportedException)
{
return null;
}
}

...
private Date hireDay;
}
我的问题是:1。cloned.hireDay=(Date)hireDay.clone()里的hireDay.clone()是怎样工作的?有什么作用?
2。String是不可变的类,Date是可变的 是指的什么?能不能举个例子。
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
muymuy 2004-09-05
  • 打赏
  • 举报
回复

1.cloned.hireDay=(Date)hireDay.clone()里的hireDay.clone()是怎样工作的?有什么作用?

想知道是怎样工作的,看Date的源码就知道了。它的作用是返回hireDay的一个拷贝,简单的说就是给你创建一个Date的对象,然后把成员变量做一一赋值,再返回给你。


2.String是不可变的类,Date是可变的 是指的什么?能不能举个例子。

String采用immutable模式设计,它对外提供的所有public方法只能query内部数据,而不能modify内部数据,所以说从一个String创建好之后,String内部数据就一直保持不变,直到String对象被销毁,这就叫immutable模式(不变模式)。

Date提供了很多setter方法,如:setDate()、setTime()等,这些方法直接修改了Date的内部数据,也就是说,Date创建好之后,它的内部数据可能会发生变化。

不变类和可变类跟clone有那么一点点联系;不变类由于内部一直数据一致保持不变,本身就是线程安全的,多线程编程的时候,就不需要做保护性拷贝,因此,不变类一般都不会实现Cloneable接口,像String、Integer、Long等都是这样;可变类则不同,由于内部数据可变,不是线程安全的,所以提供clone方法,便于在多线程程序中做保护性拷贝。

题外话:
由于sun的失误,Date被设计成了可变类,实际上Date应该被设计成不变类,像String,虽然sun后来意识到了这一点,但是已经为时过晚,为了兼容jdk以前的版本,sun只能这样继续错下去。
ntzls 2004-09-05
  • 打赏
  • 举报
回复
1、广度类成员复制
2、String采用堆分配存储表示,通过String的方法改变char成员,则该方法将返回改变后的new String。类可变是说通过相应的set方法改变类成员值域。
alpha15 2004-09-05
  • 打赏
  • 举报
回复
就是返回hireDay的一份拷贝给cloned.hireDay
String是基本的数据类型
而date类是可以重写的
32zyc 2004-09-05
  • 打赏
  • 举报
回复
corejava里的问题,我也在看
我的理解是
1。hireDay.clone()是把hireDay里的内容clone给cloned这个对象的hireday,这就是所谓的深度拷贝。如果不这么做,那么cloned这个对象中的hireday引用还是和worker指向同一个Date对象,这样做就破坏了封装性
2。String类不可变是指一旦new了一个String对象之后就不能再改变这个对象的内容,而如果new了一个Date对象之后,还可以对它进行改变
如:String s = new String("hello");
则"hello"就不能再改变了,除非你再让s引用重新指向另一个对象:
s = new String ("hi");
但不管怎么说,“hello”这个字符串对象是没有改变的,而是s引用指向了其他的一个对象,如果想要使用可以改变的字符串,可以使用StringBuffer类(coreJava Chap12有介绍)
而Date类却不相同,你可以使用setHours(),setMonth()等方法改变已有的对象
ecaol 2004-09-04
  • 打赏
  • 举报
回复
up

62,614

社区成员

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

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