我是Java的初学者,我很难理解如何在类和方法之间传递对象。我已经取得了一些进展,但是当我尝试在for循环中创建扑克牌时,我的应用程序现在失败了。如果我删除循环它工作正常。以下是包含错误的类的第一部分:
public class Testing
{
public static void main(String[] args)
{
int Deal = 1;
for(int Hand = 0; Hand < Deal; ++Hand)
{
//instantiate and derive values for Player
Card card1 = new Card();
card1.setSuit(); //assign card 1's suit
card1.setValue(); //asign card 1's value
//instantiate and derive values for Computer
Card card2 = new Card();
card2.setSuit(); //assign card 2's suit
card2.setValue(); //assign card 2's suit
//compare the two cards and make sure they are different
cardCompare(card1,card2);
}
//output the two cards to the screen
output(card1,card2);
}
这是我得到的错误:
Testing.java:26: error: cannot find symbol
output(card1,card2);
^
symbol: variable card1
location: class Testing
Testing.java:26: error: cannot find symbol
output(card1,card2);
^
symbol: variable card2
location: class Testing
2 errors
由于代码有效,如果我删除for循环,我假设某些名称card1和card2在循环外不可见?如果我想创建10或20张卡片,我想在循环中执行此操作,因此我必须遗漏一些关于实例化新对象并在程序中的其他位置使用它们的内容。
感谢您的帮助。
**更新:感谢您的初步反馈。我现在看到,如果我将实例化语句移到for循环之外,理论上我可以使用循环一遍又一遍地为这些对象分配新值,这就是我完成这个特定任务所需要的全部内容。
我仍然很好奇,是不是可以在循环中实例化新对象,但仍然在循环外使用它们?看起来这一定是可能的。
public class Testing
{
public static void main(String[] args)
{
int Deal = 1;
//instantiate and derive values for Player
Card card1 = new Card();
//instantiate and derive values for Computer
Card card2 = new Card();
for(int Hand = 0; Hand < Deal; ++Hand)
{
card1.setSuit(); //assign card 1's suit
card1.setValue(); //asign card 1's value
card2.setSuit(); //assign card 2's suit
card2.setValue(); //assign card 2's value
//compare the two cards and make sure they are different
cardCompare(card1,card2);
}
//output the two cards to the screen
output(card1,card2);
}
答案 0 :(得分:5)
card1和card变量在for循环中声明,因此只在循环内部可见。要在循环外部使用它,必须在循环之前声明它。请阅读Java 范围规则。
答案 1 :(得分:2)
card1
和card2
都在for
循环的范围内,而不是main()
的其余部分。将初始化移至for
。
答案 2 :(得分:0)
嗯,就目前而言,它会继续尝试覆盖card1和card2,因为你们都会声明并初始化它们“处理”时间。此外,更重要的是,它们将超出范围。相反,事先声明它并且只在循环中初始化它们。
你可能想要的是:
public class Testing
{
public static void main(String[] args)
{
int Deal = 1;
ArrayList<Card> playerCards = new ArrayList<Card>();
ArrayList<Card> computerCards = new ArrayList<Card>();
//instantiate and derive values for Player
Card card1;
//instantiate and derive values for Computer
Card card2;
for(int Hand = 0; Hand < Deal; ++Hand)
{
card1 = new Card();
card1.setSuit(); //assign card 1's suit
card1.setValue(); //asign card 1's value
card2 = new Card();
card2.setSuit(); //assign card 2's suit
card2.setValue(); //assign card 2's value
//compare the two cards and make sure they are different
cardCompare(card1,card2);
playerCards.Add(card1);
computerCards.Add(card2);
}
//output the two cards to the screen
output(card1,card2);
}
没有测试过,但它应该可以工作。
您还需要重新考虑使用Output方法。由于你每人将有大约20张卡, 时你认为你需要向用户展示吗?目前,您在for循环之外使用它,因此它只显示分配给每个循环的LAST值。如果你想向他们展示他们正在获得的每张卡,将输出调用放在for循环中,并且可能使用Thread.Sleep()暂停程序半秒左右,以便他们可以看到他们得到的每张卡。那,或写一个接受卡的ArrayList的输出的重载,并同时打印所有这些。再一次,如果你需要帮助,请问我。
顺便说一句,我不确定cardcompare()在幕后真正做了什么,但你可能想让它返回一个表示它们是否不同的bool。类似的东西:
bool areCardsDistinct = cardcompare(card1,card2);
这样,您可以使用结果来决定是否再次获得随机新卡