Java是另一个静态/非静态问题
好的,使用EclipseIDE并在静态/非静态问题上绊倒。我想我理解,但不是完全理解,这是代码 第一部分,主要是使用SwingUIBuilder创建的。已编辑的评论/导入 第二部分是listener类Java是另一个静态/非静态问题,java,static-methods,Java,Static Methods,好的,使用EclipseIDE并在静态/非静态问题上绊倒。我想我理解,但不是完全理解,这是代码 第一部分,主要是使用SwingUIBuilder创建的。已编辑的评论/导入 第二部分是listener类 // creates class for listen item public class XListener implements ActionListener { String foo; XListener(String setString) { foo = s
// creates class for listen item
public class XListener implements ActionListener {
String foo;
XListener(String setString) {
foo = setString;
}
public void actionPerformed(ActionEvent btnNewButton) {
**Screen.changeLabel(foo);**
}
}
它抱怨无法从类型屏幕对非静态方法changeLabel(String)进行静态引用。然而,如果我用窗口代替屏幕,它就找不到对象。这让我非常困惑。我对代码的理解是,main方法创建了一个名为window的Screen对象,初始化时它也创建了一个XListener对象。为什么它认为Actuple被执行的方法是静态的?我知道我遗漏了一些基本的东西,我一直在遵循java的“轨迹”,只是没有理解它。您的XListener类需要一个对象来调用它。调用
Screen.changelab(foo)
将尝试调用类屏幕上的静态方法。您需要将Screen对象传递到XListener类中
public class XListener implements ActionListener {
String foo;
Screen myScreen; // added
XListener(String setString, Screen theScreen) {
foo = setString;
myScreen= theScreen; // added
}
public void actionPerformed(ActionEvent btnNewButton) {
screen.changeLabel(foo); // fixed
}
}
然后更改init方法:
void initialize() {
XListener listenItem = new XListener("Woot",this); // creates listen object
// rest below
}
当操作发生时,您应该传入对要影响的
屏幕对象的引用:
// creates class for listen item
public class XListener implements ActionListener {
String foo;
Screen myScreen;
XListener(String setString, Screen scr) {
foo = setString;
myScreen = scr;
}
public void actionPerformed(ActionEvent btnNewButton) {
myScreen.changeLabel(foo);
}
}
然后,初始化侦听器,如下所示:
XListener listenItem = new XListener("Woot", this);
您必须这样做,因为changelab()
方法是屏幕上的一个实例方法,但是您试图像静态方法一样访问它。通过访问正确的屏幕
实例,您可以正确调用该方法。方法changelab
是一个实例方法,但您尝试使用的静态方法语法调用它。。您需要获取对屏幕对象的引用才能调用此方法
解决此问题的一种方法可能是将此类对象传递给侦听器的构造函数,如下所示:
XListener(Screen screen, String setString)
...
this.screen=screen;
...
}
window
是在main
中创建的匿名Runnable
子类中的run
方法中的局部变量。您当然不能在XListener.actionPerformed
中引用它
Java并不认为actionPerformed
方法是静态的-它说changelab
是非静态的,但您试图从actionPerformed
访问它,就好像它是静态的一样,这里:
Screen.changeLabel(foo);
actionPerformed
是否是静态的无关紧要,关键是您需要引用Screen
的一个实例才能调用changelab
方法。否则,这就像问“这个人有多高?”——除非你具体说明你在谈论哪个人,否则没有意义
如果您发现静态/非静态令人困惑,我强烈建议您暂时不要使用用户界面。编写一些简单的控制台应用程序,创建一些对象,调用它们的方法等。熟悉语言,最好是一些核心库(如集合和IO)。然后,您将能够进入有时令人望而生畏的用户界面世界,并且至少知道在语言级别上发生了什么。您已经定义了一个名为changeLabel的非静态方法,但随后您尝试从类外访问它,即Screen.changeLabel(),因为它不是静态方法,所以您无法执行此操作。您首先需要实例化Screen,然后从您创建的实例中调用此方法(或通过实例等,重点是非静态方法需要从对象中访问,而不是直接从类中访问)。这取决于changeLabel()的作用,您可能需要对screen进行一些其他更改,以使此方法成为静态的,因为如果screen类中的所有其他内容都是静态的,则changeLabel静态将不会有任何帮助,这将有点愚蠢。我不是在提倡那种解决方案,只是说这是一种选择,例如,
Screen.changeLabel(foo);