无法对非静态方法进行静态引用

时间:2012-11-22 00:31:20

标签: c# java main

  

可能重复:
  Cannot make a static reference to the non-static method

Java是我的第一个编程类。我们学习了OOP的基础知识,但我从来没有在课堂上提到过。在我的下一个编程语言C#中,我们使用了visual studio,这个问题也没有出现过。你如何摆脱访问其他类的主要方法?我回顾了我在课堂上编写的java程序,看起来所有的方法都是静态的。在c#中,我制作了许多程序而没有使用单个静态方法。有人能告诉我如何使这项工作?我正在尝试重写我用C#编写的java程序,但我似乎无法弄清楚如何摆脱主要问题。这是第一个使用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和谷歌的答案,但没有一个对我有意义。谢谢你的帮助!!

2 个答案:

答案 0 :(得分:1)

由于main方法是静态的,每当它尝试从任何其他类(包含方法main本身的类)中访问成员变量或方法时,他需要一个对象的限定实例或obect to如果是静态的,你可以通过声明

来解决它
private static Numbers gameNumbers;

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

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

答案 1 :(得分:0)

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

new DeluxKenoMainWindow().startGame();

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

,而不是!