【问题标题】:How can I call a non-static method from another class in Java?如何从 Java 中的另一个类调用非静态方法?
【发布时间】:2010-08-03 17:05:38
【问题描述】:

好吧,这有点乱:

我正在使用 Netbeans,并且我有一个名为 ParameterUI 的主类。 (这是一个图形用户界面) 这个类在它的 GUI 上有几个滑块,因为这些是私有的,所以我有一个名为 getBounds() 的方法。我不想弄乱我的 GUI,所以基本上计算东西的所有重要方法都在另一个名为 Structure 的类中。所以 ParameterUI 调用了 Structure 中的一个方法,该方法调用了自身内部的另外几个方法,其中一个调用了 getBounds。

问题是getBounds不能是静态的,但如果不是我就不能调用它。

在 ParameterUI.class 中:

public int[] getBounds () {
    int[] bounds = new int[2];
    bounds[0] = jSlider2.getMinimum();
    bounds[1] = jSlider2.getMaximum();
    return bounds;
}

在 Structure.class 中:

private static void myMethod (Graphics g, double[] planet, long mass) {
    int[] bounds = ParameterUI.getBounds(); //<-- doesn't work
}

使 myMethod 非静态似乎也无济于事。 恐怕虽然我知道静态与非静态的基础知识,但我已经很久没有使用类等进行编程了。

编辑:基本上,我知道问题出在哪里,我正在寻找更好的方法来解决它。

【问题讨论】:

  • 如果是实例方法,为什么不能调用getBounds
  • 你不能从静态方法访问非静态方法。

标签: java static-classes


【解决方案1】:

静态与非静态

静态意味着您无需实例化该类的对象即可访问方法。

非静态意味着您只能从该类的实例访问方法。

您需要做的是弄清楚您是否希望 ParameterUI 类中的方法是静态的。

如果您将 get bounds 更改为 Static,那么它将起作用。

public static int[] getBounds () {
   int[] bounds = new int[2];
   bounds[0] = jSlider2.getMinimum();
   bounds[1] = jSlider2.getMaximum();
   return bounds;
}

你可能想先考虑一下。

【讨论】:

  • 因为我自己没有创建 GUI,所以我不能将 getBounds 设置为静态(如果我这样做,它就无法访问非静态的私有 jSliders)。我本来希望它们是静态的……
【解决方案2】:

将 ParameterUI 实例传递给静态方法

private static void myMethod (ParameterUI param, Graphics g, double[] planet, long mass) {
    int[] bounds = param.getBounds(); //<-- doesn't work
}

但是,您可能需要重新考虑一个设计,在该设计中调用其他类的静态方法以计算有关第一个类的内容。这表明您的 UI 类所需的所有逻辑都不包含在其中,并且公共静态方法导致难以测试代码。

【讨论】:

  • 谢谢!是的,我最初认为将我的 GUI 与我的其余代码分开是一个好主意,因为我使用 Netbeans 功能来制作它而不是手工制作,但将我的所有方法迁移到它可能更容易一节课。无论如何,将 ParameterUI 实例传递给那个特定的静态方法实际上会很痛苦,因为它在我的程序中的位置。
【解决方案3】:

基础知识:您不能从静态方法访问非静态成员。

您需要创建实例或将 ParameterUI 实例传递给/在静态方法中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多