请教高手关于引用拷贝,浅拷贝及深拷贝
一下是我的抄的一个例子,
模拟两个扑克牌的,
但是我没有成功。
请教高手修改一下以实现相应拷贝模式。
本程序不要注释掉相应段落,
实现相应的拷贝类型,
具体看注释,
默认为引用拷贝。
代码如下(两个类):
/*
* Card.java
*
* Created on 2003年9月25日, 下午3:38
*/
package reference;
/**
*
* @author Administrator
*/
public class Card implements Cloneable{
//attribute
public static final int CLUB=1;
public static final int DIAMOND=2;
public static final int HEART=3;
public static final int SPADE=4;
private int suit;
private int value;
/** Creates a new instance of Card */
public Card(int s,int v) {
suit=s;
value=v;
}
public Object clone() throws CloneNotSupportedException
{
Card c=(Card) super.clone();
return c;
}
public void setCard(int s,int v)
{
suit=s;
value=v;
}
public int getSuit()
{
return suit;
}
public int getValue()
{
return value;
}
public String toString()
{
String str;
if(value==1)
str="A/";
else if(value==11)
str="J/";
else if(value==12)
str="Q/";
else if(value==13)
str="K/";
else
str=Integer.toString(value)+"/";
switch (suit)
{
case CLUB:
{
str+="Clubs";
break;
}
case DIAMOND:
{
str+="Diamond";
break;
}
case HEART:
{
str+="Hearts";
break;
}
default:
{
str+="Spades";
break;
}
}
return str;
}
}
package reference;
/*
* CardHand.java
*
* Created on 2003年9月25日, 下午3:52
*/
/**
*
* @author Administrator
*/
public class CardHand implements Cloneable{
//attribute
private Card c1;
private Card c2;
/** Creates a new instance of CardHand */
public CardHand(Card cd1,Card cd2) {
c1=cd1;
c2=cd2;
}
public String toString()
{
return "c1: "+c1+", c2: "+c2;
}
//不要注释以下6行,实现浅拷贝和深拷贝
// public Object Clone() throws CloneNotSupportedException
// {
// CardHand c=(CardHand) super.clone();
//不要注释以下2行,实现深拷贝
// c.c1=(Card) c1.clone();
// c.c2=(Card) c2.clone();
// return c;
// }
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws CloneNotSupportedException{
Card newCard = new Card(Card.HEART,7);
CardHand origHand=new CardHand(new Card(Card.SPADE,1),new Card(Card.SPADE,13));
//不要注释下一段实现引用拷贝
CardHand saveHand=origHand;
System.out.println("\n**** REFERENCE COPY ****\n\n"
+"BEFORE: saveHand=origHand;:\n"
//不要注释下一段实现浅拷贝
/*
CardHand saveHand=(CardHand) origHand.clone();
System.out.println("\n**** SHALLOW COPY ****\n\n"
+"BEFORE: saveHand = origHand.clone();:\n"
*/
//不要注释下一段实现深拷贝
/*
CardHand saveHand=(CardHand) origHand.clone();
System.out.println("\n**** DEFP COPY ****\n\n"
+"BEFORE: saveHand=origHand.clone();:\n"
*/
+"\n origHand is " + origHand
+"\n saveHand is " + saveHand
+"\n newCard is " + newCard +"\n");
origHand.c1=newCard;
origHand.c2.setCard(Card.DIAMOND,4);
newCard.setCard(Card.CLUB,2);
System.out.println(
"AFTER: origHand.c1=newCard;\n"
+" origHand.c2.setCard(DIAMOND,4);\n"
+" newCard.setCard(CLUB,2);:\n"
+"\n origHand is "+origHand
+"\n saveHand is "+saveHand
+"\n newCard is "+newCard +"\n");
}
}