6

例如,我正在尝试做这样的事情

public class Test {

    public static void main(String args[]) {

        int[] arr = new int[5];

        arrPrint(arr);
    }

    public void arrPrint(int[] arr) {

        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);

    }
}

我收到一条错误消息,告诉我无法从静态环境中引用非静态变量。因此,如果这是真的,我将如何在 main 中使用非静态方法?

4

7 回答 7

14

你不能。非静态方法是必须在 Test 类的实例上调用的方法;在您的 main 方法中创建一个要使用的 Test 实例:

public class Test {

    public static void main(String args[]) {
        int[] arr = new int[5];
        arr = new int[] { 1, 2, 3, 4, 5 };

        Test test = new Test();
        test.arrPrint(arr);

    }

    public void arrPrint(int[] arr) {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);

    }
}
于 2013-06-08T22:04:19.047 回答
2

您只能使用类实例调用非静态方法,因此您必须使用new关键字创建它。

public class Something {

    public static void main(String args[]) {
        Something something = new Something();
        something.method1();

        new Something().method2();
    }

    public void method1() {
    }

    public void method2() {
    }
}
于 2013-06-08T21:30:44.983 回答
0

简而言之,你不能。因为 main 是一种特殊情况(即只有一个入口点),所以除了静态方法、main 中的变量之外,您不能拥有任何东西。

于 2013-06-08T21:30:12.117 回答
0

需要在类的实例上调用非静态方法。要创建实例,请使用new关键字

Test instance = new Test();

现在您将能够在实例上调用方法,例如

instance.arrPrint(arr);
于 2013-06-08T21:30:50.580 回答
0

new Something().method1() 或 new Something().method2()

于 2013-06-08T21:31:39.070 回答
0

根据您的新示例,解决方案将是:

public class Test {

    public static void main(String args[]) {
        int[] arr = new int[5];
        new Test().arrPrint(arr);
    }

    public void arrPrint(int[] arr) {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);

    }
}

或者你可以移动

int[] arr = new int[5];

到静态部分,比如

public class Test {

    static int[] arr; 

    public static void main(String args[]) {
        arr = new int[5]; 
        new Test().arrPrint(arr);
    }

    public void arrPrint(int[] arr) {
        for (int i = 0; i < arr.length; i++)
            System.out.println(arr[i]);
    }
}

但是从良好的编程实践来看,第二个闻起来真的很糟糕

于 2013-06-08T21:59:50.617 回答
0

non-static -> 属性object

static method-> 类本身的属性。

因此,当方法/变量声明中没有static关键字时,如果没有来自静态上下文的类的任何实例,您就不能调用/引用该方法/变量。

正如其他人建议的那样new Test(),在主方法和调用方法中创建主类的新实例()non-static arrPrint

于 2013-06-08T22:30:30.663 回答