37 java inheritance constructor
新手Java问题.说我有:
public class Car{
...
}
public class Truck extends Car{
...
}
Run Code Online (Sandbox Code Playgroud)
假设我已经有了一个Car对象,如何从这个Car对象创建一个新的Truck对象,以便将Car对象的所有值复制到我的新Truck对象中?理想情况下,我可以这样做:
Car c = new Car();
/* ... c gets populated */
Truck t = new Truck(c);
/* would like t to have all of c's values */
Run Code Online (Sandbox Code Playgroud)
我是否必须编写自己的复制构造函数?每次Car获得一个新领域时都必须更新...
Tom*_*ine 34
是的,只需将构造函数添加到Truck.您可能还想为Car添加构造函数,但不一定是公开的:
public class Car {
protected Car(Car orig) {
...
}
public class Truck extends Car {
public Truck(Car orig) {
super(orig);
}
...
}
Run Code Online (Sandbox Code Playgroud)
作为一项规则,通常最好将类(或者您可能想要标记那些最终的)或抽象化.
它看起来好像你想要一个Car
对象,然后让相同的实例变成一个Truck
.更好的方法是将行为委托给Car
(Vehicle
)中的另一个对象.所以:
public final class Vehicle {
private VehicleBehaviour behaviour = VehicleBehaviour.CAR;
public void becomeTruck() {
this.behaviour = VehicleBehaviour.TRUCK;
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果您实现,Cloneable
那么您可以"自动"将对象复制到同一个类的实例.然而,存在许多问题,包括必须复制易于出错的可变对象的每个字段并且禁止使用final.
小智 7
如果您在项目中使用Spring,则可以使用ReflectionUtils.