有一个Base类重写过了从Object中继承来的 protected Object clone()方法,且重写的方法定义成public的;
这时有一个子类Sub扩展了Base类(自定义了一些方法和属性),此时用子类对象调用从Base继承而来的clone()时,
克隆了哪一部分啊?是子类本身还是子类中的父类那一部分?好像就其他方法而言(不包括clone()),子类调用父类中的方法时操纵的应该是子类中的父类那一部分吧?不知道我理解的对不对,请帮忙讲讲啊。
我感觉继承机制本身没有想象的那么简单书上说的感觉很笼统,不知道发生了什么事情

解决方案 »

  1.   

    克隆最终调用的都是 Object 对象的 clone,是整个对象的克隆,不分父类子类。
      

  2.   


    clone 是个很糟糕的例子,其实不用特别纠结。
      

  3.   

    看一下API文档:
    clone
    protected Object clone()
                    throws CloneNotSupportedException创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。这样做的目的是,对于任何对象 x,表达式: 
    x.clone() != x为 true,表达式: 
    x.clone().getClass() == x.getClass()也为 true,但这些并非必须要满足的要求。一般情况下: 
    x.clone().equals(x)为 true,但这并非必须要满足的要求。 
    按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。 按照惯例,此方法返回的对象应该独立于该对象(正被复制的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。 Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我复制。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。 
      

  4.   

    这个有个clone的例子,看一下吧!!
    package com.clone;public class CloneTest1 
    {
    public static void main(String [] args)
    {
    Student student = new Student();
    student.setAge(20);
    student.setName("zhaoming");

    Student student2 = (Student)student.clone();

    System.out.println(student2.getAge());
    System.out.println(student2.getName());

    System.out.println("--------------------");
    student2.setName("lisi");
    System.out.println(student.getName());
    System.out.println(student2.getName());
    }
    }
    class Student implements Cloneable
    {
    private int age;
    private String name;
    /**
     * @return the age
     */
    public int getAge() {
    return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
    this.age = age;
    }
    /**
     * @return the name
     */
    public String getName() {
    return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
    this.name = name;
    }
    public Object clone() 
    {
    Object object = null;
    try {
    object = super.clone();
    } catch (CloneNotSupportedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return object;
    }
    }
      

  5.   

    如果student类再派生出子类呢?