这个错误困扰着我:
cannot make a static reference to the non-static method XYZ from the type ABC
我的眼睛只是茫然。我意识到之前曾问过这个问题,但我想要这个5岁的治疗方法。它只是没有意义..
我正在运行一个类,我在public static void main
中有代码,然后我在它之外创建了一个函数。
答案 0 :(得分:3)
您尝试在main中调用的函数没有static关键字。添加它,编译器不会抱怨。
public class Foo {
public static void main(String [] args) {
bar();
}
public static void bar() {
System.out.println("compiler won't complain");
}
}
这并不意味着这是正确的做法。
静态方法和成员与类相关联;非静态方法和成员与实例相关联。确保你了解其中的差异。如果不这样做,那么很难进行面向对象的编码。
如果它是非静态方法,那么您需要执行以下操作:
public class Foo {
public static void main(String [] args) {
Foo foo = new Foo();
foo.bar(); // Associated with the new Foo instance named foo.
}
public void bar() {
System.out.println("compiler won't complain");
}
}
答案 1 :(得分:1)
归结为类成员和实例成员。请阅读本文档,了解有关为什么类成员无法直接引用实例成员的更多详细信息。
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
答案 2 :(得分:1)
Java具有“静态”和“实例”方法。 “静态”方法在其定义中有static
(例如您对static
方法总是说main
的方式。“实例”方法没有单词{{1}在其定义中。
可以使用static
从任何环境调用静态方法。实例方法只能使用对方法类对象的引用来调用。即,您必须使用ClassName.staticMethodName(parms)
,其中objectReference.instanceMethodName(parms)
引用方法类的对象。 (如果从类的另一个实例方法内部调用,则隐含objectReference
。)
答案 3 :(得分:1)
如果您在main
函数旁边创建的函数不是静态的,则无法从main
方法调用它,这是静态的。
那是因为你没有创建包含这两个函数的类的任何实例。非静态的方法(因此,实例方法)本身就需要该类的实例才能被调用。
假设您有以下示例:
public class Test{
public static void main(String args[]){
}
public void doSomething(){
}
}
如果您想从doSomething()
方法调用main
方法,则必须看起来像
public static void main(String args[]){
new Test().doSomething();
}