Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有超类和子类的Java克隆_Java_Clone_Subclass_Superclass - Fatal编程技术网

带有超类和子类的Java克隆

带有超类和子类的Java克隆,java,clone,subclass,superclass,Java,Clone,Subclass,Superclass,我有两个简单的Java类,我试图了解更多关于克隆的知识,以及如何在不同级别的类之间转换。这是超类车辆 public class Vehicle implements Cloneable { public int x; public Vehicle(int y) { x = y; } @Override public Object clone() { Object result = new Vehicle(this.

我有两个简单的Java类,我试图了解更多关于克隆的知识,以及如何在不同级别的类之间转换。这是超类车辆

public class Vehicle implements Cloneable 
{
     public int x;

     public Vehicle(int y) { 
          x = y;
     }

     @Override public Object clone() { 
      Object result = new Vehicle(this.x);
      // Location "A"
      return result;
    }
}
这是卡车的子类

public class Truck extends Vehicle 
{
   private int y;

   public Truck(int z) {
       super(z); 
       y = z;
   }

   @Override public Object clone() {
      Object result = super.clone();
      System.out.println(result.getClass());
      ((Truck) result).y = this.y; 
      return result; 
    }
}
我试图在使用超类进行克隆时获取Truck的副本,但存在不允许向下播放的问题。我真的不知道如何解决这个问题,也不知道错误在哪里


我希望:卡车a=新卡车(1)和卡车b=a.clone()成为同一个对象。

您误用了
clone()
。当您实现
Cloneable
时,所有实例化和字段复制都由
super
实现完成。您的
车辆
实施应如下所示:

@Override
public Vehicle clone() {
    try {
        return (Vehicle)super.clone();
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}
@Override
public Truck clone() {
    return (Truck)super.clone();
}
您可以选择在
Truck
中覆盖它,如下所示:

@Override
public Vehicle clone() {
    try {
        return (Vehicle)super.clone();
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}
@Override
public Truck clone() {
    return (Truck)super.clone();
}

当您从一个类转换到另一个类时,您不会更改实际对象,而是以不同的方式使其可访问

class A { public int x; }
class B extends A { public int y; }
A a = new A();
B aB = new B();
System.out.println(aB); // A@...
System.out.println(aB.y); // throws an error
调用
super.clone()
时,它会创建一个
Vehicle
实例,而
Vehicle
实例没有
y

相反,您可能希望启动对象,而不是在
Truck.clone
中调用
super.clone()

    return new Vehicle(this.y);
super.clone()
返回
Vehicle
类型的对象,而不是
Truck
。 因此,您应该在
Truck
的构造函数中调用
super(x)

public class Truck extends Vehicle 
{
   private int y;

   public Truck(int x, int y) {
       super(x); 
       this.y = y;
   }

   @Override public Object clone() {
      Object result = new Truck(this.x, this.y);
      return result; 
    }
}

你的super.clone()在
结果中返回一辆车,所以它是一辆车,而不是一辆卡车。为什么卡车a=新卡车(1)和卡车b=a?由于您试图获取相同的对象,请将
车辆中的
clone()
方法替换为
@Override public object clone(){return super.clone();}
Object
版本的
clone()
可以很好地执行您正在执行的操作(包括返回正确类型的对象);您只需将其公开为
public
。更好的是,不要使用
clone()
,而是使用复制构造函数。请参阅。捕获
CloneNotSupportedException
真的有必要吗?毕竟,
Vehicle
被声明为实现了
Cloneable
,所以这个异常永远不会被抛出。@TedHopp它是一个选中的异常,所以没有选择。但它实际上永远不会发生,因此出现断言错误。我认为这并不能解决最大的问题,即强制转换对象。@clabe45什么问题?@clabe45-最大的问题是从
Vehicle\clone()返回的对象类型错误。
。问题的症状是演员阵容造成的问题,但这不是问题本身。不要这样做。这不是克隆的用途。如果你想要一个简单的复制方法,可以叫它
copy
或者其他什么。