请教高手关于引用拷贝,浅拷贝及深拷贝

nobody_am 2003-09-27 04:22:35
一下是我的抄的一个例子,
模拟两个扑克牌的,
但是我没有成功。
请教高手修改一下以实现相应拷贝模式。
本程序不要注释掉相应段落,
实现相应的拷贝类型,
具体看注释,
默认为引用拷贝。

代码如下(两个类):
/*
* 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");
}

}
...全文
122 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nobody_am 2003-10-06
  • 打赏
  • 举报
回复
---------------
// c.c1=(Card) c1.clone();
// c.c2=(Card) c2.clone(); ????是否可以使用c.c1 c.c2直接赋值?他们是private
---------------
还在CardHand类内部,所以可以直接赋值。

---------------
Card c=(Card) super.clone();
??这个地方为什么不给c的两个private(suit,value)进行显示赋值?
return c;
---------------
为了浅拷贝,简单的说就是经过origHand.c2.setCard(DIAMOND,4)后,saveHand.c.c2还要受到origHand的影响。
---------------

作者的答案是:
引用拷贝:
**** REFERENCE COPY ****

BEFORE: saveHand=origHand;:

origHand is c1:A/Spades,c2:K/Spades
saveHand is c1:A/Spades,c2:K/Spades
newCard is 7/Hearts

ALTER: origHand.c1=newCard;
origHand.c2.setCard(DIAMOND,4);
newCard.setCard(CLUE,2);:

origHand is c1:2/Clubs,c2:4/Diamonds
saveHand is c1:2/Clubs,c2:4/Diamonds
newCard is 2/Clubs

浅拷贝:
**** SHALLOW COPY ****

BEFORE: saveHand=origHand;:

origHand is c1:A/Spades,c2:K/Spades
saveHand is c1:A/Spades,c2:K/Spades
newCard is 7/Hearts

ALTER: origHand.c1=newCard;
origHand.c2.setCard(DIAMOND,4);
newCard.setCard(CLUE,2);:

origHand is c1:2/Clubs,c2:4/Diamonds
saveHand is c1:A/Spades,c2:4/Diamonds
newCard is 2/Clubs

深拷贝:
**** DEEP COPY ****

BEFORE: saveHand=origHand;:

origHand is c1:A/Spades,c2:K/Spades
saveHand is c1:A/Spades,c2:K/Spades
newCard is 7/Hearts

ALTER: origHand.c1=newCard;
origHand.c2.setCard(DIAMOND,4);
newCard.setCard(CLUE,2);:

origHand is c1:2/Clubs,c2:4/Diamonds
saveHand is c1:A/Spades,c2:K/Spades
newCard is 2/Clubs


您可以自己对照看看。

MessiahLS 2003-10-04
  • 打赏
  • 举报
回复
程序中
//不要注释以下6行,实现浅拷贝和深拷贝
// public Object Clone() throws CloneNotSupportedException
// {
// CardHand c=(CardHand) super.clone();
//不要注释以下2行,实现深拷贝
// c.c1=(Card) c1.clone();
// c.c2=(Card) c2.clone(); ????是否可以使用c.c1 c.c2直接赋值?他们是private
// return c;
// }


public Object clone() throws CloneNotSupportedException
{
Card c=(Card) super.clone();
??这个地方为什么不给c的两个private(suit,value)进行显示赋值?
return c;
}

nobody_am 2003-10-04
  • 打赏
  • 举报
回复
up
popyyb 2003-10-03
  • 打赏
  • 举报
回复
up
nobody_am 2003-10-03
  • 打赏
  • 举报
回复
up
我试验深拷贝实现不了。
qm0445 2003-09-29
  • 打赏
  • 举报
回复
UP
Yanbin_Q 2003-09-29
  • 打赏
  • 举报
回复
那些好像是c++里的概念啊。
java里也有吗?我真是孤陋寡闻啦。
nobody_am 2003-09-29
  • 打赏
  • 举报
回复
ding

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧