Java 类型对象中的克隆()不可见
这是我的节目。如果存在Java 类型对象中的克隆()不可见,java,clone,Java,Clone,这是我的节目。如果存在this.pizzaorder[i].clone()或this.pizzaorder[count].clone(),我会收到一个错误,指出类型对象的clone()不可见。需要帮忙吗 import java.text.NumberFormat; public class PizzaOrder { NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance(); public int TotalNoOfPizz
this.pizzaorder[i].clone()
或this.pizzaorder[count].clone()
,我会收到一个错误,指出类型对象的clone()
不可见。需要帮忙吗
import java.text.NumberFormat;
public class PizzaOrder {
NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance();
public int TotalNoOfPizzas, keep;
//declaring the variables needed for this class
public double totalcost;
Pizza[] pizzaorder = new Pizza[TotalNoOfPizzas];
int i;
public PizzaOrder() {
//constructor to initialize all the varibales
this.TotalNoOfPizzas = 0;
this.totalcost = 0.0;
for ( i = 1; i <= pizzaorder.length; i++ ) {
pizzaorder[i] = null; }
}
public PizzaOrder( PizzaOrder keep ) {
// copy constructor
for ( i = 1; i <= pizzaorder.length; i++) {
this.pizzaorder[i] = this.pizzaorder[i].clone(); }
this.TotalNoOfPizzas = keep.TotalNoOfPizzas;
this.totalcost = keep.totalcost; }
public int getTotalNoOfPizzas() {
//using Accessor to get the number of pizzas
return this.TotalNoOfPizzas; }
public void setTotalNoOfPizzas( int TotalNoOfPizzas1 ) {
//using mutators to set the number of pizzas
this.TotalNoOfPizzas = TotalNoOfPizzas1; }
public Pizza getPizza ( int pizzas) {
//using Accessor to get the size and toppings for pizza 1
return (this.pizzaorder[pizzas]); }
public void setPizza(Pizza tempPizza, int count) {
this.pizzaorder[count].clone(); }
public double getTotalCost() {
return(this.totalcost); }
public void setTotalCost(double totalcost1) {
this.totalcost = totalcost1; }
public double calcTotal() {
//calculating the total cost
double totalcostoford = 0;
for (i = 1; i <= pizzaorder.length; i++) {
totalcostoford += this.pizzaorder[i].calcCost(); }
return totalcostoford; }
public String tostring() {
String pizzaDescription;
pizzaDescription = "\n Order No.:" + this.pizzaorder;
pizzaDescription +="\nTotal No. of pizza's ordered:" + TotalNoOfPizzas;
for ( i = 0; i <= pizzaorder.length; i++ ) {
pizzaDescription += "\n" + i + ". Pizza" +
pizzaorder[i].getPizzaDescription(); }
pizzaDescription += "\n" + moneyFormatter.format(this.getTotalCost()) + "is your
total price.";
return pizzaDescription;
}
}
导入java.text.NumberFormat;
公共类比萨饼订单{
NumberFormat moneyFormatter=NumberFormat.getCurrencyInstance();
公共交通,保持畅通;
//声明此类所需的变量
公共成本;
比萨饼[]比萨饼订单=新比萨饼[TotalNoOfPizzas];
int i;
公共比萨饼订单({
//构造函数初始化所有变量包
这个.TotalNoOfPizzas=0;
这是总成本=0.0;
对于(i=1;i要克隆一个类,需要重写clone()方法,您需要将创建类的新实例的代码放入其中,并将另一个类的成员变量复制到该实例中,然后返回新实例。您最初的问题是,如果希望克隆公开可见,您需要在类中声明一个public
克隆方法
但仅仅这样做是不够的:
public Object clone() {
try {
return super.clone();
} catch (Exception e) {
return null;
}
}
这有两个问题。首先,捕获异常并返回null
,这违反了clone()
预期行为的约定。请阅读Object.clone()的javadoc
以了解它的行为方式。在发生故障时,没有理由返回null
。您应该抛出异常,或允许现有异常传播
javadoc也解释了出现异常的原因。您依赖于对象的本机克隆机制。但该机制仅在您尝试克隆的类实现了Cloneable
标记接口时有效。如果没有,则调用super.clone()
将引发CloneNotSupportedException
最后,我要指出的是,您需要小心克隆。一方面,克隆成本可能会很高。另一方面,使用本机克隆机制进行克隆并不总是为您的应用程序做“正确的事情”。这种机制只会给您提供一个浅拷贝;即,它不会复制“组件”您正在克隆的对象的对象。我建议不要使用clone
,而是使用复制构造函数
在Pizza
类中,添加一个副本构造函数:
class Pizza {
private final sometype some field;
...
Pizza(Pizza that) {
this.somefield = that.somefield;
}
...
而不是
this.pizzaorder[i] = keep.pizzaorder[i].clone();
做
嗯,这更干净,更容易理解。我把它添加到我的程序公共对象clone(){try{return super.clone();}catch(Exception e){return null;}}}但它仍然不起作用:(顺便说一下,你上面有一个拼写错误:this.pizzaorder[I]=this.pizzaorder[I].clone();
应该是this.pizzaorder[i]=keep.pizzaorder[i].clone();
this.pizzaorder[i] = new Pizza(keep.pizzaorder[i]);