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

时间:2017-07-25 09:18:08

标签: java instance-variables class-variables

简单的代码,计算给定数组中的数字n,但是我收到一个错误,告诉我将instancevariable更改为static。

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更改为静态。

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

3 个答案:

答案 0 :(得分:1)

你是指静态函数内部的两个变量,它们本身需要是静态的,以避免错误。

静态方法是可以在没有类的对象的情况下调用的方法。这意味着没有this引用,也没有分配给访问的实例变量。相反,静态变量在加载类时分配,并且可用于静态和非静态方法。

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

答案 1 :(得分:1)

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

  

您永远不能直接访问静态上下文中的非静态成员。

这就是为什么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));
}

答案 2 :(得分:0)

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

arrc被声明为Test实例变量,因此它们是该类的每个实例的成员。 main方法范围内不存在此类实例。

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

最简单的解决方案是简单地在主方法中移动arrc的定义。根据您的使用情况,他们没有理由成为班级成员。

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));
    }
}

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

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

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));
    }
}

但是^这有点粗糙。