从子类构造函数调用实例方法

时间:2013-08-17 03:22:54

标签: java inheritance instance subclass

我正在编写一个简单的二十一点程序,我打算随着Java变得更好而扩展。我的课程没有很好地涵盖继承,他们根本不打算讨论子类。

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

  

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

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

我附上了一段与子类和整个main方法有关的代码。此外,这是一个个人项目,而不是家庭作业,以帮助建立我的投资组合,所以任何其他你认为值得的建议,我欢迎。谢谢你的帮助。

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 个答案:

答案 0 :(得分:2)

您的变量alice正在main()中使用,这是静态的,main()在对象内不“存在”,但您的变量alice必须在内部一。对代码执行此更改以在对象内部执行非静态方法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!");
}

答案 1 :(得分:0)

您的alice变量声明为非静态,但正在静态main方法中使用,禁止使用。有些人可能会建议您将alice作为静态变量,但我建议不要这样做。相反,考虑让你的主要方法非常短 - 只需要启动和运行程序,并有另一个类,也许是一个游戏类,一个非静态方法和字段,实际上运行游戏。 main方法将创建一个Game实例,然后在这个Game实例上调用一个方法让它启动整个游戏。

顺便说一句,我看不出你想如何让Player扩展BlackJack类,因为Player的概念不是一个更专业的“BlackJack”概念,无论可能是什么。

答案 2 :(得分:0)

您的变量alice声明时没有static修饰符。这意味着只有在实例化包含类的实例时才能使用此对象。

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

如果你将alice设为静态,它就会起作用。

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

答案 3 :(得分:0)

在主方法中移动Player alice = new Player(0, 250);