乐趣区

关于java:为什么无法在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…
退出移动版