有人可以向我解释我5岁时的错误“静态参考非静态方法”

时间:2013-11-10 23:36:59

标签: java static-methods

这个错误困扰着我:

cannot make a static reference to the non-static method XYZ from the type ABC

我的眼睛只是茫然。我意识到之前曾问过这个问题,但我想要这个5岁的治疗方法。它只是没有意义..

我正在运行一个类,我在public static void main中有代码,然后我在它之外创建了一个函数。

4 个答案:

答案 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();
}