-4

这个错误困扰着我:

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

我的眼睛只是呆滞了。我意识到以前有人问过这个问题,但我想要 5 岁的治疗。这只是没有意义..

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

4

4 回答 4

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");
    }
}
于 2013-11-10T23:39:39.637 回答
1

它归结为类成员和实例成员。请阅读此文档以了解有关为什么类成员不能直接引用实例成员的更多详细信息。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

于 2013-11-10T23:41:23.480 回答
1

Java 有“静态”和“实例”方法。“静态”方法static在其定义中具有(例如您总是对方法说static的方式。“实例”方法在其定义main中没有单词。static

可以从任何环境调用静态方法,使用ClassName.staticMethodName(parms). 实例方法只能使用对该方法类的对象的引用来调用。即,您必须使用objectReference.instanceMethodName(parms), whereobjectReference引用方法类的对象。(objectReference如果从类的另一个实例方法内部调用,则隐含 。)

于 2013-11-10T23:43:26.077 回答
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();
}
于 2013-11-10T23:43:39.777 回答