为什么无奈在Main办法中调用外部类的clone办法?

Object类是Java中所有类的始祖,其中定义了clone办法。

例如:
定义如下类

public class Person {}

应用上面的语句调用

public class TestClone {    public static void main(String[] args) {        Person t = new Person();        Object clone = t.clone();//这里会报错 'clone()' has protected access in 'java.lang.Object'    }    }

为什么继承来的办法调用不了?

在idea中能够看到报错内容:
'clone()' has protected access in 'java.lang.Object'

大略的意思是:java.lang.Object的clone()办法的拜访权限是protected

《Java编程思维》外面有这么一句话:被protected润饰的成员对于本包和其子类可见

能够了解为:

  1. 父类的protected成员是包内可见的,并且对子类可见;
  2. 若子类与父类不在同一包中,那么在子类中,子类能够在类外部调用从父类继承而来的protected办法,而不能在子类内部调用父类实例的protected办法。

对于第二条,能够看上面的例子:

public class Person {    //在原来Person中定义getIntance办法    public Person getIntance() {        Person p = null;        try {            p = (Person) clone();//能够失常调用父类(Object )的clone办法        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return p;    }}

通过下面的例子能够晓得为什么不能调用clone办法:因为Main办法不在Person类外部

如果须要在内部调用clone办法,须要实现Cloneable接口,并笼罩clone办法。

如下:

public class Person implements Cloneable{        @Override    protected Person clone() throws CloneNotSupportedException {        return (Person) super.clone();    }}

参考:

  1. 《Java编程思维》
  2. https://blog.csdn.net/asahino...