0

可能重复:
无法对非静态方法进行静态引用

Java 是我的第一堂编程课。我们学习了 OOP 的基础知识,但我从来没有在课堂上提出过这个问题。在我的下一个编程语言 C# 中,我们使用了 Visual Studio,但这个问题也从未出现过。你如何摆脱 main 方法来访问其他类?我回顾了我在课堂上编写的 java 程序,看起来所有方法都是静态的。在 c# 中,我制作了许多程序,而没有使用单一的静态方法。有人可以告诉我如何进行这项工作吗?我正在尝试用 Java 重写我用 C# 编写的程序,但我似乎无法弄清楚如何摆脱 main。这是带有 main 方法的第一个类:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DeluxKenoMainWindow extends JFrame 
{
    private Numbers gameNumbers;

   public DeluxKenoMainWindow()
   {
    initUI();   
   }

   public final void initUI()
   {
     setLayout(null);



    int xCoord = 85;
     int yCoord = 84;
     Button[] button = new Button[80];
     for(int i = 0; i<80; i++)
     {
         String buttonName = "button" + i;
        if(i % 10 == 0)
        {
            xCoord = 12;
            yCoord +=44;
        }


        if(i % 40 == 0)
            yCoord += 10;


         button[i] = new Button(buttonName, xCoord, yCoord, i+1);
         xCoord += 42;
         getContentPane().add(button[i]);
     }

     getContentPane().add(new Game(gameNumbers));
     getContentPane().add(new AnimatedGraphics());
     getContentPane().add(new BackgroundImage());

     setTitle("Delux Keno");
     setSize(600,600);

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLocationRelativeTo(null);

   }

   public void startGame()
   {
       do
       {
           Boolean[] pickedNumbers = gameNumbers.getNumbers();
       }while (gameNumbers.numbersSet = false);
   }


   public static void main(String[] args)
   {
     startGame();
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            System.setProperty("DEBUG_UI", "true");
            DeluxKenoMainWindow ex = new DeluxKenoMainWindow();
            ex.setVisible(true);

        }
    });



   }


   }

这是我要访问的课程:

import java.util.Random;


public class Numbers<syncronized> {

    private volatile Boolean[] computerNumbers = new Boolean[80];


    private static final Object OBJ_LOCK = new Object();

    public volatile Boolean numbersSet;


    public void setNumbers()
    {

        synchronized(OBJ_LOCK)
        {
            int i = 0;
            Random randy = new Random(System.currentTimeMillis());

            do{
                int testNum = randy.nextInt(80);

                if(computerNumbers[testNum] = false)
                {
                    computerNumbers[testNum] = true;
                    i++;
                }

            }while(i < 20);

            numbersSet = true;
        }
    }

    public Boolean[] getNumbers()
    {
        synchronized(OBJ_LOCK)      
        {
            Boolean[] returnComputerNumbers = new Boolean[80];
            for(int i = 0; i < computerNumbers.length; i++)
            {
                returnComputerNumbers[i] = computerNumbers[i];
                computerNumbers[i] = false;
            }
            return returnComputerNumbers;

        }
    }

}

我确信有一个简单的解决方法,但我似乎找不到它。我确实在 stackoverflow 和谷歌上寻找答案,但这些对我来说都没有意义。谢谢你的帮助!!

4

2 回答 2

1

由于main方法是静态的,每当它尝试从任何其他类(包括包含方法 main 本身的类)访问成员变量或方法时,他需要对象的合格实例或对象本身是静态的,您可以解决它通过声明

private static Numbers gameNumbers;

所以 gameNumbers 不会是每个实例的实例变量,DeluxKenoMainWindow而只是一个可以从静态上下文访问的实例。

实际上有很多解决方案可以解决您的问题(哪些应该是静态的,哪些不是)所以它主要取决于您的需求,只需遵循要求从静态上下文访问的所有内容都是静态的或附加到对象的特定实例的原则.

于 2012-11-22T00:35:18.743 回答
0

您应该创建该类的实例DeluxKenoMainWindow以使用其实例方法。利用:

new DeluxKenoMainWindow().startGame();

或者

DeluxKenoMainWindow d = new DeluxKenoMainWindow()
d.startGame();

反而!

于 2012-11-22T00:34:36.373 回答