可能重复:
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和谷歌的答案,但没有一个对我有意义。谢谢你的帮助!!
答案 0 :(得分:1)
由于main
方法是静态的,每当它尝试从任何其他类(包含方法main本身的类)中访问成员变量或方法时,他需要一个对象的限定实例或obect to如果是静态的,你可以通过声明
private static Numbers gameNumbers;
这样gameNumbers不会是DeluxKenoMainWindow
的每个实例的实例变量,而只是一个可以从静态上下文访问的实例。
实际上有很多解决方案可以解决你的问题(它应该是静态的,哪些不是),所以它主要取决于你的需求,只需要遵循以下原则:从静态上下文访问的所有内容都是静态的或附加到对象的特定实例。
答案 1 :(得分:0)
您应该创建类DeluxKenoMainWindow
的实例以使用其实例方法。使用:
new DeluxKenoMainWindow().startGame();
或
DeluxKenoMainWindow d = new DeluxKenoMainWindow()
d.startGame();
,而不是!