1

我正在编写一个简单的二十一点程序,我计划随着 Java 的进步而扩展它。我的课程没有很好地涵盖继承,他们根本没有费心讨论子类。

当玩家决定结束游戏时,我想打印出玩家的总筹码数。每当我编写打印语句时,我都会收到错误消息:

无法对非静态字段 alice 进行静态引用。

我不知道 Eclipse 所说的非静态字段是什么意思,因为static我唯一熟悉的是顶级方法。我是否必须创建一个完全独立的类Player来进行引用?

我附上了一段与子类和整个主要方法有关的代码。此外,这是一个个人项目,而不是家庭作业,以帮助建立我的作品集,因此,我欢迎您认为值得提出的任何其他建议。谢谢您的帮助。

public class BlackJack 
{

public class Player extends BlackJack
{
    public int wallet;
    private int hand;

    public Player(int playerHand, int playerWallet)
    {
        wallet = playerWallet;
        hand = playerHand;
    }

    public int getWallet()
    { return wallet; }
}

Player alice = new Player(0, 250);

public static void main(String[] args)
{
    System.out.println("Welcome to Black Jack. Type begin to get started.");

    String begin = "begin";
    String end = "end";
    Scanner keyboard = new Scanner(System.in);

    while (!keyboard.equals(end))
        {

        }
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!");
}

}

4

4 回答 4

2

您的变量alice正在用于 中main(),它是静态的,main()不在对象内“存在”,但您的变量alice必须在一个对象内。对代码进行此更改以在对象“内部”执行非静态方法run()(run 与 main 具有相同的代码,它只是更改为非静态方法):

public static void main(String[] args) {
    new BlackJack().run(args);
}

public void run(String[] args) {
    System.out.println("Welcome to Black Jack. Type begin to get started.");

    String begin = "begin";
    String end = "end";
    Scanner keyboard = new Scanner(System.in);

    while (!keyboard.equals(end))
    {

    }
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!");
}
于 2013-08-17T03:26:07.413 回答
0

您的 alice 变量被声明为非静态变量,但在静态 main 方法中使用,这是禁忌。有些人可能会建议您将 alice 设为静态变量,但我不建议这样做。相反,请考虑使您的 main 方法非常短——足以让程序启动并运行,并让另一个类,也许是一个带有非静态方法和字段的 Game 类,实际运行游戏。main 方法会创建一个 Game 实例,然后在这个 Game 实例上调用一个方法,让它开始整个游戏。

顺便说一句,我看不出您希望如何让 Player 扩展 BlackJack 类,因为 Player 的概念并不是“BlackJack”的更专业的概念。

于 2013-08-17T03:25:51.393 回答
0

您的变量alice是在没有static修饰符的情况下声明的。这意味着该对象只能在包含类的实例已被实例化时使用。

但是,您使用alice.getWallet()public static void main()方法是static. 由于静态意味着可以在不创建封闭类的对象的情况下调用此方法,这意味着该方法将尝试访问无法访问的非静态对象alice

如果你做alice静态,它会工作。

更好的方法是让您的程序从main()方法开始并转到非静态Game类或类似的东西。使用静态修饰符没有麻烦。

于 2013-08-17T03:26:21.397 回答
0

Player alice = new Player(0, 250);在main方法里面移动!

于 2013-08-17T03:41:58.093 回答