带有超类和子类的Java克隆
我有两个简单的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.
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
或者其他什么。