gpt4 book ai didi

c# - 无法对非静态方法进行静态引用

转载 作者:行者123 更新时间:2023-12-01 15:02:03 25 4
gpt4 key购买 nike

Possible Duplicate:
Cannot make a static reference to the non-static method

Java 是我的第一堂编程课。我们学习了面向对象编程的基础知识,但我从未在类里面提到过这一点。在我的下一个编程语言 C# 中,我们使用 Visual Studio,这个问题也从未出现过。如何跳出main方法去访问其他类?我回顾了一下我在类里面编写的java程序,看起来所有方法都是静态的。在 C# 中,我编写了许多程序,但没有使用单个静态方法。有人可以告诉我如何进行这项工作吗?我正在尝试用 java 重写一个用 C# 编写的程序,但我似乎不知道如何退出 main.c 程序。这是带有 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 和谷歌上寻找答案,但这些对我来说都没有意义。感谢您的帮助!!

最佳答案

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

private static Numbers gameNumbers;

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

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

关于c# - 无法对非静态方法进行静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com