class A{int i;}
class B extends A{}
class C extends B{}
修改上述类的定义,使A、B、C对象都能实现拷贝什么叫实现对象拷贝……

解决方案 »

  1.   

    用构造函数  将父类的实例变量的值拷贝到子类当中  super(i)
      

  2.   

    java中的拷贝分为深拷贝和浅拷贝,一般来说类必须实现java.lang.Cloneabel接口而且使用publik访问权限从写clone方法下面先我们来实现浅拷贝person1.java的代码如下:public class Person1 implements Cloneable{
     
     private Car car;  //这个人的车
     private String name;//名字
     
     public Person1(String name,String carName){
      
      this.name = name;
      
      car = new Car(carName);
     } @Override
     public Object clone() {
      
      try{
       return super.clone();
      }catch(CloneNotSupportedException e){
       
              e.printStackTrace();
       return null;
      }
      
     } public Car getCar() {
      return car;
     } public String getName() {
      return name;
     } public void setName(String name) {
      this.name = name;
     }}car.java  类的代码如下:
    public class Car {
     
     private String name;
     
     public Car(String name){
      
      this.name = name;
     } public String getName() {
      return name;
     } public void setName(String name) {
      this.name = name;
     }
     
    }测试类ShallowCopyTest的代码入下:public class ShallowCopyTest { public static void main(String[] args){  Person1 person = new Person1("zhangsan", "aodi");  System.out.println("Original value --->" + person.getName()
        + " has--> " + person.getCar().getName());  Person1 q = (Person1) person.clone();  System.out.println("clone value --->" + q.getName() + " has--> "
        + q.getCar().getName());  q.setName("lisi");  q.getCar().setName("benci");  System.out.println("clone(After) value --->" + q.getName() + " has--> "
        + q.getCar().getName());  System.out.println("clone value --->" + person.getName() + " has--> "
        + person.getCar().getName()); }}在ShallowCopyTest中我们先生成了Person1的一个实例然后输出了他的信息然后我们通过浅拷贝赋值给另一个Person对象接着输出了这个对象的信息,接着我们通过这个对象进行了一些信息的修改,接着我们输出了这个对象的信息和原来那个对象的信息。当我们运行上面的ShallowCopyTest类时输出:Original value --->zhangsan has--> aodi
    clone value --->zhangsan has--> aodi
    clone(After) value --->lisi has--> benci
    clone value --->zhangsan has--> benci接下来我们实现深拷贝:Person2.java的代码和Person1的代码大致相同只是重写的clone的内容改为:@Override
     public Object clone() {
      
      Person2 person = new Person2(name,car.getName());
      
      return person;
     }car类不变;测试类DeepCopyTest的代码如下:public class DeepCopyTest { public static void main(String[] args){  Person2 person = new Person2("zhangsan", "aodi");  System.out.println("Original value --->" + person.getName()
        + " has--> " + person.getCar().getName());  Person2 q = (Person2) person.clone();  System.out.println("clone value --->" + q.getName() + " has--> "
        + q.getCar().getName());  q.setName("lisi");  q.getCar().setName("benci");  System.out.println("clone(After) value --->" + q.getName() + " has--> "
        + q.getCar().getName());  System.out.println("clone value --->" + person.getName() + " has--> "
        + person.getCar().getName()); }}运行这个类输出:Original value --->zhangsan has--> aodi
    clone value --->zhangsan has--> aodi
    clone(After) value --->lisi has--> benci
    clone value --->zhangsan has--> aodi接下来我们看看深拷贝和浅拷贝输出有什么异同相同:当拷贝的对象中含有基本类型时,当通过拷贝对像(q)改变属性值时原对象(person)的属性值不会改变不同 : 当考拷贝对象含有其他对象的引用时,在浅拷贝中拷贝对像(q)和原对象(person)共享其他对象的引用拷贝对像(q)改变引用属性值时原对象(person)的引用属性值也相应改变。相反在生拷贝中拷贝对像(q)和原对象(person)不共享其他对象的引用,拷贝对像(q)改变引用属性值时原对象(person)的引用属性值不会改变
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happysmhzp/archive/2010/06/03/5646002.aspx
      

  3.   

    class A implements Cloneable{
    int i; protected Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }class B extends A {
    protected Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }class C extends B {
    protected Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }