Java是另一个静态/非静态问题

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

好的,使用EclipseIDE并在静态/非静态问题上绊倒。我想我理解,但不是完全理解,这是代码

第一部分,主要是使用SwingUIBuilder创建的。已编辑的评论/导入

第二部分是listener类

// 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);