protected权限的说明中有一个是说:父类的protected方法,子类可以跨包调用
也做了下实验是成功的。
但是没搞懂为什么Object的clone()方法,作为我们写的所有的类都应该是他的子类吧,为什么却不能直接用?还需要重写,把protected改成public的呢?
 想了很久。

解决方案 »

  1.   

    没有啊,看源码中clone()方法在object是实现了的! 
      

  2.   

    并且,编译器报的错是: 该表达式是不可见的,也就是针对projected报错
      

  3.   

    子类只能调用受保护的clone()方法克隆他自己,为此必须重新定义clone()方法,并把他定义为public。下面解释一下:
    简单地说 在A类中进行 
    JAVA code
    new B().clone();是不行的
     
    假设即使A B同包 且B未覆盖clone方法,只能是子类调用受保护的clone方法克隆他自己。如在A类中 
    JAVA code
    this.clone();可以的要想在A中调用B的clone方法,就需要B中重写clone方法,可以定义成public或protected。
      

  4.   

    Class X = ...............X.clone();
    一般都不是在X这个类里面调用的,而是在别的类里面调用的吧,所以当然是不能用了。
      

  5.   

    Object的clone()方法是protected型的,只有实现了Cloneable接口才可以在该类的实例上调用clone()方法,否则会抛出CloneNotSupportException。
      

  6.   

    答:原因是:
    1)Object 类的 clone 方法执行特定的克隆操作。如果你自己定义的类没有实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。
    2)Object 类本身不实现接口 Cloneable,所以在你自己定义的类中为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
      

  7.   

    因此:如果你偷懒,想在你自己的类中,直接调用Object的clone()方法,则:只要在你自己定义的类上实现接口 Cloneable接口即可.(Cloneable接口中的抽象方法clone(),自动由你从类Object继承的clone()来默认自动实现了,当然通常你要进行该方法的重写)
      

  8.   

    Object的源码中的代码是
    protected native Object clone() throws CloneNotSupportedException;
    clone为何称作“Cloneable接口”,Object类没有implements Cloneable呀?
      

  9.   

    答:对不起,没有仔细查看API.还是以API为准吧:public interface Cloneable{}
    一个类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。 注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 
      

  10.   

    恩,谢谢大家的回答。不知道是不是我的问题没写明白,还是我没理解你们的回答。我知道如果要用clone()方法就要重写,并且要实现cloneable这个接口,和抛出异常,也清楚clonerable这个接口其实只是个标签一样,里面并不包含clone()这个方法等等这一系列问题的。而我真正想问的就是:
     
    我在两个不同的包下写分别写两个类A,B ,  并且B继承A,  B能直接调用A类中的protected方法。
    我就对clone()方法产生了疑惑,子类怎么会不能直接用父类的Object 的protected修饰的clone()方法呢??    protected权限说了子类可以跨包调用父类的方法嘛?
      

  11.   

    问:我在两个不同的包下写分别写两个类A,B ,  并且B继承A,  B能直接调用A类中的protected方法。 
    我就对clone()方法产生了疑惑,子类怎么会不能直接用父类的Object 的protected修饰的clone()方法呢??    protected权限说了子类可以跨包调用父类的方法嘛?
    答:谁说的.你当然可以直接调用父类Object的clone()方法,这是没有问题的啊.
    当你调用父类Object的clone()方法时,该方法中代码会首先检查当然对象的类有没有实现Clonerable接口,若没有,则抛出 CloneNotSupportedException 异常,否则就执行你的代码.
    因此:这就是为什么必须要求:在定制你自己的clone()代码时,必须这样写:  public Object clone()//定制你自己的clone()代码
     {
        super.clone();
    //这正是调用父类Object的clone()方法,目的:进行检查当然对象,有没有实现Clonerable接口  //然后此处才是你的真正的clone代码
      }若你有意违反规则,就是不写上:super.clone();
    则:你的clone()方法就没有进行检查,就不会再抛出 CloneNotSupportedException 异常了.
    但:这不是一个好做法.因为:super.clone();除了检查之外,还做了其它的事件.
      

  12.   

    谢谢 算是明白了!!那么我们重写clone()方法的目的并不只是为了把权限改大,(权限改成public目的也只是为了方便别人调用是吧?)
    主要是实现Cloneable接口。
    谢谢谢谢!!