日期:2014-05-20  浏览次数:20675 次

JAVA参数传递问题
//第一个类
public class Card {
public char suit;
public String rank;
  public Card(char suit, String rank) {
  this.suit = suit;
  this.rank = rank;
  }
   
public String toString() {
return suit+rank;
}
}




//第二个类
public class JLab1201 {
static final char suits[] ={'H','S','D','C'};
static final String ranks[] ={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
static Card[] cards=new Card[52];
/**
* 初始化扑克牌数组
*/
public static void init(){
for(int i=0;i<suits.length;i++){
for(int j=0;j<ranks.length;j++){
cards[i*ranks.length+j]=new Card(suits[i],ranks[j]);
}
}
}
public static void swap1(Card c1,Card c2){
Card c=c1;
c1=c2;
c2=c;
}
public static void swap1(int i,int j){
Card c=cards[i];
cards[i]=cards[j];
cards[j]=c;
}
public static void swap2(Card c1,Card c2){
char s=c1.suit;
c1.suit=c2.suit;
c2.suit=s;
String r=c1.rank;
c1.rank=c2.rank;
c2.rank=r;
}
/**
* @param args
*/
public static void main(final String[] args) {
init();
//任取两张牌
Card c1=cards[10];
Card c2=cards[12];
System.out.println("第11张牌是:"+c1+"\t第13张牌是:"+c2);
}
}



问题:

1) 在main方法中,添加下面几行语句,分析结果
swap1(c1,c2);
System.out.println("执行swap1(c1,c2)后");
System.out.println("c1引用的牌是:"+c1+"\tc2引用的牌是:"+c2);
System.out.println("第11张牌是:"+cards[10]+"\t第13张牌是:"+cards[12]);

2) 在main方法中,去掉刚才添加的语句,添加下面几行语句,分析结果
swap1(10,12);
System.out.println("执行swap1(10,12)后");
System.out.println("c1引用的牌是:"+c1+"\tc2引用的牌是:"+c2);
System.out.println("第11张牌是:"+cards[10]+"\t第13张牌是:"+cards[12]);

3) 在main方法中,去掉刚才添加的语句,分析结果
swap2(c1,c2);
System.out.println("执行swap2(c1,c2)后");
System.out.println("c1引用的牌是:"+c1+"\tc2引用的牌是:"+c2);
System.out.println("第11张牌是:"+cards[10]+"\t第13张牌是:"+cards[12]);


模拟运行了一下,第二个和第三个的结果出乎我的意料。 求高手详细解释一下!



------解决方案--------------------
你所想的与程序运行的结果不对,就出乎你的意料?
那就仔细检查程序过程。。分析每一步程序时如何变化的。。最终自己还是能够找到答案的
------解决方案--------------------
那你就谈谈你出乎意料在哪里吧。。。
------解决方案--------------------
public static void swap1(Card c1,Card c2){ 
//LZ先想想这里的参数的c1,c2和main方法的c1,c2是不是相同的变量?
//每个方法有自己的栈,每个局部变量属于自己的方法栈,所以这里的c1,c2和main的c1,c2不是相同变量
 Card c=c1;
 c1=c2; //所以这里是让swap1的c1指向了别的对象,但是main方法的c1不变,因为这两个c1不是同一个
 c2=c;
 }
 
public static void swap1(int i,int j){ //这里传进来的参数i是10,j是12
//数组就不用解释了,因为main方法的c1就是指向cards[i],c2就是指向cards[j]
//所以cards[i]变成什么,c1就指向什么,cards[j]变成什么c2就指向什么
 Card c=cards[i];
 cards[i]=cards[j];
 cards[j]=c;
 }

public static void swap2(Card c1,Card c2){
//重点要说的是这个,要说这个和swap1的区别
//首先上面swap1的说明已经说了,这里的c1,c2和main的c1,c2是两个不同的变量
//但是这两个不同的变量指向的对象相同,也就是两个c1虽然不是同一个变量,但它们都指向cards[10]对象
 char s=c1.suit;
 c1.suit=c2.suit; //所以这里就是改变cards[10]的suit属性
 c2.suit=s;//这里是改变cards[12]的suit属性
 String r=c1.rank;
 c1.rank=c2.rank; //这里就是改变cards[10]的rank属性
 c2.rank=r;//这里是改变cards[12]的rank属性
//因为main方法的c1指向cards[10],c2指向cards[12],而cards[10],cards[12]的属性改变了,
//所以也就是c1,c2所指向的对象改变了,所以打印结果就变了
 }