Object类型的方法clone()不可见。延伸解决它

时间:2016-05-17 17:07:24

标签: java clone extend

public class Human extends Main implements Cloneable{
    public String name;
    public Human(){};
    public Human(String input){
        this.name = input;
    }
}

import java.util.Scanner;
public class Main{
   public static void main(String[] args) {
      try{
         Scanner in = new Scanner(System.in);
         String input = in.next();

         Human h1 = new Human(input);
         Human h2 = (Human) h1.clone();

         System.out.println("Human original " + h1.name);
         System.out.println("Human clone " + h2.name);
         in.close();
      } catch(Exception e){}
   }
}

为什么Human类必须扩展Main?如果没有,Human h2 =(Human)h1.clone()将给出错误“Object类型的方法clone()不可见”

Human class扩展Main的重点是什么? Human类不需要从Main类继承任何东西。

2 个答案:

答案 0 :(得分:2)

Object.clone();受到保护,这意味着它对同一个包中的子类和类是可见的。如果您不展开Main,则clone()Human继承ObjectMain不可见)后,Main不可见。但是,扩展clone()意味着Main继承自public,它位于同一个包中,使其可以访问。

但通常情况下,您要实施clone() super.clone();Person.find({ "$or": [ {name: "John", lastname: "Doe"}, {name: "Alice", lastname: "Lorem"}, {name: "Bob", lastname: "Ipsum"} ] }) ,即使只是在其中调用$scope.hide_emptytable() = function{ return ($.trim($('.acf-dynamic-table .field').text())=="") }

答案 1 :(得分:0)

Cloneableclone()是Java早期版本的遗留设计错误;不要使用它们。

如果你想创建一个"克隆"一个实例,提供一个拷贝构造函数,并自己复制字段:

public Human(Human other) {
  this.name = other.name;
}

Effective Java 中有一个项目详细描述了克隆的问题,以及为什么要避免它(也是described here)。