Object类是所有类的父类, 在JDK6帮助文档中有明确说明: Object类有clone()方法, 而且是protected的, 那么为什么StringBuffer类没有clone()方法呢?
例如,如下的程序会编译时报错:StringBuffer sb = new StringBuffer("sb");
sb.clone();
进而发现Object类的对象也没有clone()方法, 这与帮助文档不符, 请高手帮忙解释一下, 谢谢.

解决方案 »

  1.   

    StringBuffer中是有这个方法的,上面编译报错是“方法不可见”因为它是protected的而且没有实现Clonable,所以你不能调用它
      

  2.   

    有是有的,but it is not visible
    比如:
    class Test {
      public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("sb");
        //sb.clone();这样是不行的,这里理解起来可能有点绕,StringBuilder从Object类继承了clone()方法
        //所谓protected方法在子类中能调用在这里是这样的,再StringBuilder里面clone()方法是可以用的,而
        //我写的这个Test并不在StringBiulder里面,想要早这个Test里面用clone()方法是可以的
        new Test().clone();//编译通过
      }
    }可以去这里看看:
    http://blog.csdn.net/dreamhunter_lan/archive/2009/03/06/3964087.aspx
      

  3.   

    默认没实现的clone都是对外部包不可见的。
      

  4.   

    是的,stringBuffer继承了object的clone()方法,这个方法是受保护的方法,只能在子类中和同一个包中可见,所以你不能调用,要不大家重写clone的时候总是说加上public修饰符呢。
      

  5.   

    是的,stringBuffer继承了object的clone()方法,这个方法是受保护的方法,只能在子类中和同一个包中可见,所以你不能调用,要不大家重写clone的时候总是说加上public修饰符呢。
      

  6.   

    Object类是有clone()方法的而且是Protected的,所以StringBuffer也是有的
    但是JAVA规定,任何使用clone方法的类,必须实现Cloneable接口,可以查看Object类Clone方法的doc文档The class Object does not itself implement the interface 
       Cloneableso calling the clone method on an object 
       whose class is Object will result in throwing an exception at run time.
      

  7.   

    java.lang.StringBuffer 
    java.lang.Object-->protected clone()看的出来StringBuffer跟Object是平行的
    并且StringBuffer里面没有clone()方法
      

  8.   


    protected 修饰是什么意思?
    new Object().clone();  //这样能编译不?
      

  9.   

    谢谢大家, 我就是觉得很多时候讨论一下, 才能理清一些细节上的问题, 我冒昧地总结一下吧:
    ChDw和dreamhunter_lan说的很对, 我的这个问题可以分为两个方面:
    1. 编译错误。
        因为从Object类继承过来的clone()方法是protected类型的, 所以, 这个方法有是有的, 不过是不可见的, 所以会报编译时错误(这是我犯的一个低级错误)。
    2. 运行时异常。
       如果编译通过, 但是没有实现Cloneable接口, 那么也是要抛出java.lang.CloneNotSupportedException异常的, 所以, 如果不做异常处理, 同样会发生运行时异常。    说得不对的兄弟我没有给分,请现仔细看完别人的讲解之后再生气吧,^_^