我尝试在静态方法(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
错误。
有人可以分析代码并告诉我我做错了什么吗? 另外,是否有更简单的方法来覆盖此错误?
答案 0 :(得分:1)
如果要调用非静态方法(即实例方法),则需要该类的实例。就这么简单。所以你有两种可能性:a)要么确保你有一个类的实例(这是你的选项1),要么b)使你想要调用静态的方法。在您的情况下哪一个最好取决于您没有提供的具体代码。
创建子类不会使方法成为静态,并且在没有实例的情况下不会使非静态方法可调用。无论如何,在你的代码片段中,你没有创建任何子类。
只有拥有该类的实例时,才能调用实例方法。创建实例可能很麻烦,因为构造函数非常复杂,但可能是您的实例方法需要此信息才能正常运行。
但是,每次需要调用方法时,通常不需要创建新实例;您可以创建一个新实例并每次都使用它:
class Foo {
Bar instance;
Foo() {
instance = new Bar(/* lots of parameters */);
}
void f() {
// ...
instance.sA2s(input1);
// ...
instance.sA2s(input2);
// ...
}
}
可能是您的方法sA2a
不依赖于任何对象,例如因为它只访问静态变量(和局部变量)并且只调用静态方法。在这种情况下,您可以将其设为静态。可以从静态上下文中调用静态方法。
答案 1 :(得分:0)
为什么sA2是私有的?试试公开。
子类可能不是最好的主意,因为父类可能具有复杂的构造函数。你不能把这个逻辑提取到Util类中吗?
调用非静态公共方法的规则是保存对拥有该方法的类(或子类)的引用。
答案 2 :(得分:0)
您尝试在静态上下文中使用内部类作为静态嵌套。所以你应该把它变成静态嵌套:
public static class sclass
或者你可以使用它向上层阶级投掷referance:
UpperClassName upperClass = new UpperClassName();
sclass ss = upperClass.new sclass();