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

Posted Yang_SH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么无法在Main方法中调用外部类的clone方法?相关的知识,希望对你有一定的参考价值。

为什么无法在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...

以上是关于为什么无法在Main方法中调用外部类的clone方法?的主要内容,如果未能解决你的问题,请参考以下文章

关于Clone 的方法使用

java 如何调用局部内部类和匿名类

Java:clone() 操作调用 super.clone()

如何调用内部类中的静态方法

为什么Object.clone()是Java原生的?

模板类 error LNK2019: 无法解析的外部符号