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()等方法改变已有的对象

解决方案 »

  1.   

    就是返回hireDay的一份拷贝给cloned.hireDay
    String是基本的数据类型
    而date类是可以重写的
      

  2.   

    1、广度类成员复制
    2、String采用堆分配存储表示,通过String的方法改变char成员,则该方法将返回改变后的new String。类可变是说通过相应的set方法改变类成员值域。
      

  3.   


    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只能这样继续错下去。