为什么我需要在这里使用 class- 而不是 instancevariable?

Why do I need to use class- instead of instancevariable here?

简单的代码,计算给定数组中的数字 n,但我收到一个错误,告诉我将我的实例变量更改为静态。

public class Test{

   int []arr = {4, 21, 4};
   Counter c = new Counter();

   public static void main(String[] args) {
      System.out.println(c.counter(4, arr));
   }
}

public class Counter {

   public int counter(int n, int []ar){  //tried to change method to static - didn't help
       int counter = 0;
       for(int i = 0; i < ar.length; i++){
           if(n == ar[i]){
               counter++;
           }
       }
       return counter;
   }
}

错误出现在第 7 行:将 int [] arrCounter c 更改为静态。

试图将计数器方法设为静态,但它仍然告诉我将数组更改为静态。什么原因?

您是从静态函数内部引用这两个变量,它们本身需要是静态的以避免错误。

静态方法是一种无需 class 的对象即可调用的方法。这意味着没有 this 引用,也没有分配给访问的实例变量。相反,静态变量是在加载 class 时分配的,并且可用于静态和非静态方法。

在您的代码中,问题是您尝试从 main 方法内部访问变量,该方法始终是静态的。

main 方法是在静态上下文中,不是吗?您在 Test 中声明的数组和计数器不是静态的。

You can never directly access non-static members in a static context.

这就是 IDE 建议您将字段设置为静态的原因。

counter 方法更改为静态并不能真正解决问题,因为您仍在尝试在静态上下文中直接访问 arr

解决此问题的另一种方法是同时创建 carr 局部变量:

public static void main(String[] args) {
    int []arr = {4, 21, 4};
    Counter c = new Counter();
    System.out.println(c.counter(4, arr));
}

程序的 main 方法不能绑定到 class 的实例,因此它被定义为静态的。

arrc 被声明为 Test 实例变量 ,因此它们是 [=36] 的每个实例的成员=]. main 方法的范围内不存在这样的实例。

静态方法中使用的任何标识符必须是以下之一: a) 相同 class 的静态成员 b) 在方法内声明的局部变量 c) 在全局命名空间中(例如另一个 class 的静态成员,如 Math.pi)

最简单的解决方案是简单地将 arrc 的定义移动到 main 方法中。鉴于您的使用情况,他们没有理由成为 class 的成员。

public class Test{

    public static void main(String[] args) {
        int []arr = {4, 21, 4};
        Counter c = new Counter();
        System.out.println(c.counter(4, arr));
    }
}

如果您需要它们成为 class 的成员,您只需更改原始代码,使它们成为静态的(即 static int []arr = {4, 21, 4};

更灵活的解决方案可能涉及使用命令行参数来指定值,或者如果您想使用实例变量,则在 main 方法中实例化 class:

public class Test{

    int []arr = {4, 21, 4};
    Counter c = new Counter();

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.c.counter(4, t.arr));
    }
}

但是^这有点恶心。