如何将对象克隆到Object类的对象?

时间:2015-08-22 11:21:04

标签: java class object clone

据我所知,Object class是一个顶级课程,它是所有课程的家长。如果我们在编译时不知道类的类型,我们可以将它分配给Object类的对象。

我正在尝试将clone对象作为Object class的对象。还尝试从HashMap获取已经实例化的对象。我这样做有问题。你能弄明白并解释正确的方法吗?我已经评论了哪些行我得到编译时错误。我的主要疑虑是:

  • 如果父类'对象可以用于克隆,那么它也必须使用Object类,因为它是顶级类。

  • 以及如何从地图访问对象并将其用于方法调用和克隆。

代码:

import java.util.HashMap;
import java.util.Map;


class Sample {
    public void call(){

}

}
class Question extends Sample implements Cloneable {
@Override
    public void call(){
    System.out.println("hello");
}
@Override
    public Object clone()throws CloneNotSupportedException{  
    return super.clone();  
    }  

public static void main(String args[]) throws CloneNotSupportedException{
    Map<Character,Object> map=new HashMap();
    Question s=new Question();
    Sample q=new Question();
    Sample cl=(Question)s.clone();
    Object ob=(Question)s.clone();//no compile time error
    map.put('o',s);
    s.call();//hello
    q.call();//hello
    cl.call();/hello
    ob.call();//Compile time error: cannot find  symbol call
    map.get('o').call();//Compile time error: cannot find  symbol call
    Object obj=(Question) (map.get('o')).clone();// Compile time error: clone has protected access in Object

}
}

1 个答案:

答案 0 :(得分:3)

以下行可以简化

Object ob=(Question)s.clone();//no compile time error
// the cast is unnecessary:
Object ob= s.clone();

但就像你说的那样,ob仍会包含Question个对象。问题是,一旦你开始使用这个ob引用,java就知道它包含值Object或它的子类。因此对于java ob可以是NumberStringAirplane

Object ob = "airplane";

一旦到达ob.call()行,它就会拒绝。因为它不确定ob对象是否有call方法。例如,如果它是StringNumber则不可能。

出于这个原因你必须首先执行一个简单的演员:

((Question)ob).call(); 
// or 
((Sample)ob).call();

让java知道它是一个带调用方法的对象。

地图#call问题具有相同的推理:

map.get('o').call();
//could be any of these
((Sample)map.get('o')).call();
((Question)map.get('o')).call();

但最后一个问题更棘手。实际上,当您将语句拆分为多行时,很明显很清楚:

Object obj=(Question) (map.get('o')).clone();
// would be the same like writing:
Object value = map.get('o');
Object value2 = value.clone();
Object obj = (Question) value2; // The (Question) cast is actually unnecessary.

问题出在value.clone()步骤中。确实,Object类具有clone方法,但它标记为protectedclone方法标记为QuestionSample {1}}类为public。 所以简而言之Object#clone是无法访问的; <{1}}和Sample#clone可供访问。

Question#clone

如果您希望在一行中完成所有操作:

// so you want this:
Object value = map.get('o');
Object value2 = ((Question)value).clone(); // add a cast here
Object obj = value2;