在Java中的静态方法中调用非静态方法(非静态变量错误)

时间:2016-03-05 05:36:35

标签: java static

我尝试在静态方法(sA2s)中调用非静态方法(addGenCache),而我的IDE (JetBrains IntelliJ)给出了

Error:(56, 27) java: non-static method sA2s(java.lang.String[]) cannot be referenced from a static context

经过研究,我发现我有选择:
1)调用家庭班级的实例(Generator):
但是,如果Generator的所有构造函数都非常复杂,我将需要在静态上下文中多次使用sA2s(),这将是无益的。

2)创建子类:
我试过这个

public static void addGenCache(String genDetails[]){
    record gen = new record("generators", true);
    try {
        sclass ss = new sclass();
        gen.writeLine(ss.sA2s(genDetails));
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("IO EXCEPTION CAUGHT");
    }
}

public class sclass{

    private String sA2s(String in[]){
        //prepare input for export
    }

}

但现在我明白了:

Error:(55, 21) java: non-static variable this cannot be referenced from a static context

此外,如果我尝试将sclass初始化为静态,则会出现illegal start of expression错误。

有人可以分析代码并告诉我我做错了什么吗? 另外,是否有更简单的方法来覆盖此错误?

3 个答案:

答案 0 :(得分:1)

如果要调用非静态方法(即实例方法),则需要该类的实例。就这么简单。所以你有两种可能性:a)要么确保你有一个类的实例(这是你的选项1),要么b)使你想要调用静态的方法。在您的情况下哪一个最好取决于您没有提供的具体代码。

创建子类不会使方法成为静态,并且在没有实例的情况下不会使非静态方法可调用。无论如何,在你的代码片段中,你没有创建任何子类。

答:创建一个实例

只有拥有该类的实例时,才能调用实例方法。创建实例可能很麻烦,因为构造函数非常复杂,但可能是您的实例方法需要此信息才能正常运行。

但是,每次需要调用方法时,通常不需要创建新实例;您可以创建一个新实例并每次都使用它:

class Foo {
    Bar instance;

    Foo() {
       instance = new Bar(/* lots of parameters */);
    }

    void f() {
        // ...
        instance.sA2s(input1);
        // ...
        instance.sA2s(input2);
        // ...
    }
}

B:使方法静态

可能是您的方法sA2a不依赖于任何对象,例如因为它只访问静态变量(和局部变量)并且只调用静态方法。在这种情况下,您可以将其设为静态。可以从静态上下文中调用静态方法。

答案 1 :(得分:0)

为什么sA2是私有的?试试公开。

子类可能不是最好的主意,因为父类可能具有复杂的构造函数。你不能把这个逻辑提取到Util类中吗?

调用非静态公共方法的规则是保存对拥有该方法的类(或子类)的引用。

答案 2 :(得分:0)

您尝试在静态上下文中使用内部类作为静态嵌套。所以你应该把它变成静态嵌套:

public static class sclass

或者你可以使用它向上层阶级投掷referance:

UpperClassName upperClass = new UpperClassName();
sclass ss = upperClass.new sclass();

Docs about nested classes.